Add test suite, fix a mountain of small errors.
diff --git a/tests/ir-tests.cpp b/tests/ir-tests.cpp
new file mode 100644
index 0000000..1344379
--- /dev/null
+++ b/tests/ir-tests.cpp
@@ -0,0 +1,97 @@
+/**
+ * Defines tests for validating CPER-JSON IR output from the cper-parse library.
+ *
+ * Author: Lawrence.Tang@arm.com
+ **/
+
+#include "gtest/gtest.h"
+#include "test-utils.hpp"
+extern "C" {
+#include "json.h"
+#include "../cper-parse.h"
+#include "../json-schema.h"
+#include "../generator/cper-generate.h"
+}
+
+/*
+* Test templates.
+*/
+void single_section_ir_test(const char* section_name)
+{
+ //Generate CPER record for generic processor.
+ char* buf;
+ size_t size;
+ FILE* record = generate_record_memstream(§ion_name, 1, &buf, &size);
+
+ //Convert to IR, free resources.
+ json_object* ir = cper_to_ir(record);
+ fclose(record);
+ free(buf);
+
+ //Validate against schema.
+ char error_message[JSON_ERROR_MSG_MAX_LEN] = {0};
+ int valid = validate_schema_from_file("./specification/cper-json.json", ir, error_message);
+ ASSERT_TRUE(valid) << error_message;
+}
+
+/*
+* Single section tests.
+*/
+TEST(GenericProcessorTests, IRValid) {
+ single_section_ir_test("generic");
+}
+TEST(IA32x64Tests, IRValid) {
+ single_section_ir_test("ia32x64");
+}
+// TEST(IPFTests, IRValid) {
+// single_section_ir_test("ipf");
+// }
+TEST(ArmTests, IRValid) {
+ single_section_ir_test("arm");
+}
+TEST(MemoryTests, IRValid) {
+ single_section_ir_test("memory");
+}
+TEST(Memory2Tests, IRValid) {
+ single_section_ir_test("memory2");
+}
+TEST(PCIeTests, IRValid) {
+ single_section_ir_test("pcie");
+}
+TEST(FirmwareTests, IRValid) {
+ single_section_ir_test("firmware");
+}
+TEST(PCIBusTests, IRValid) {
+ single_section_ir_test("pcibus");
+}
+TEST(PCIDevTests, IRValid) {
+ single_section_ir_test("pcidev");
+}
+TEST(DMArGenericTests, IRValid) {
+ single_section_ir_test("dmargeneric");
+}
+TEST(DMArVtdTests, IRValid) {
+ single_section_ir_test("dmarvtd");
+}
+TEST(DMArIOMMUTests, IRValid) {
+ single_section_ir_test("dmariommu");
+}
+TEST(CCIXPERTests, IRValid) {
+ single_section_ir_test("ccixper");
+}
+TEST(CXLProtocolTests, IRValid) {
+ single_section_ir_test("cxlprotocol");
+}
+TEST(CXLComponentTests, IRValid) {
+ single_section_ir_test("cxlcomponent");
+}
+TEST(UnknownSectionTests, IRValid) {
+ single_section_ir_test("unknown");
+}
+
+//Entrypoint for the testing program.
+int main()
+{
+ testing::InitGoogleTest();
+ return RUN_ALL_TESTS();
+}
\ No newline at end of file