regulators: Create System class

Create a C++ class that represents the entire computer system being
controlled and monitored by the BMC.

The system contains one or more chassis.  Chassis are large enclosures
that can be independently powered off and on by the BMC.

Signed-off-by: Shawn McCarney <shawnmm@us.ibm.com>
Change-Id: Iba40637a229c1787b017e7f19b011192621a5d23
diff --git a/phosphor-regulators/test/system_tests.cpp b/phosphor-regulators/test/system_tests.cpp
new file mode 100644
index 0000000..b5f33f1
--- /dev/null
+++ b/phosphor-regulators/test/system_tests.cpp
@@ -0,0 +1,95 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "action.hpp"
+#include "chassis.hpp"
+#include "mock_action.hpp"
+#include "rule.hpp"
+#include "system.hpp"
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::regulators;
+
+TEST(SystemTests, Constructor)
+{
+    // Create Rules
+    std::vector<std::unique_ptr<Rule>> rules{};
+    std::vector<std::unique_ptr<Action>> actions{};
+    actions.emplace_back(std::make_unique<MockAction>());
+    rules.emplace_back(
+        std::make_unique<Rule>("set_voltage_rule", std::move(actions)));
+
+    // Create Chassis
+    std::vector<std::unique_ptr<Chassis>> chassis{};
+    chassis.emplace_back(std::make_unique<Chassis>(1));
+
+    // Create System
+    System system{std::move(rules), std::move(chassis)};
+    EXPECT_EQ(system.getChassis().size(), 1);
+    EXPECT_EQ(system.getChassis()[0]->getNumber(), 1);
+    // TODO: Add tests for IDMap once code to populate it is implemented
+    EXPECT_EQ(system.getRules().size(), 1);
+    EXPECT_EQ(system.getRules()[0]->getID(), "set_voltage_rule");
+}
+
+TEST(SystemTests, GetChassis)
+{
+    // Specify an empty rules vector
+    std::vector<std::unique_ptr<Rule>> rules{};
+
+    // Create Chassis
+    std::vector<std::unique_ptr<Chassis>> chassis{};
+    chassis.emplace_back(std::make_unique<Chassis>(1));
+    chassis.emplace_back(std::make_unique<Chassis>(3));
+
+    // Create System
+    System system{std::move(rules), std::move(chassis)};
+    EXPECT_EQ(system.getChassis().size(), 2);
+    EXPECT_EQ(system.getChassis()[0]->getNumber(), 1);
+    EXPECT_EQ(system.getChassis()[1]->getNumber(), 3);
+}
+
+TEST(SystemTests, GetIDMap)
+{
+    // TODO: Code to build IDMap is not implemented yet
+}
+
+TEST(SystemTests, GetRules)
+{
+    // Create Rules
+    std::vector<std::unique_ptr<Rule>> rules{};
+    std::vector<std::unique_ptr<Action>> actions{};
+    actions.emplace_back(std::make_unique<MockAction>());
+    rules.emplace_back(
+        std::make_unique<Rule>("set_voltage_rule", std::move(actions)));
+    actions.emplace_back(std::make_unique<MockAction>());
+    rules.emplace_back(
+        std::make_unique<Rule>("read_sensors_rule", std::move(actions)));
+
+    // Create Chassis
+    std::vector<std::unique_ptr<Chassis>> chassis{};
+    chassis.emplace_back(std::make_unique<Chassis>(1));
+
+    // Create System
+    System system{std::move(rules), std::move(chassis)};
+    EXPECT_EQ(system.getRules().size(), 2);
+    EXPECT_EQ(system.getRules()[0]->getID(), "set_voltage_rule");
+    EXPECT_EQ(system.getRules()[1]->getID(), "read_sensors_rule");
+}