private void CompileAndRunCppFile(string typeDefinitions, JObject reference) { var unitJson = JsonModelBuilder.FromCppFile(typeDefinitions); var serializers = SerializerBuilder.FromJson(unitJson); var output = $"{Path.GetFileNameWithoutExtension(typeDefinitions)}.Out.cpp"; var main = $"{Path.GetFileNameWithoutExtension(typeDefinitions)}.Main.cpp"; var contents = "#include <iostream>" + Environment.NewLine + Environment.NewLine + File.ReadAllText(typeDefinitions) + Environment.NewLine + Environment.NewLine + serializers + Environment.NewLine + Environment.NewLine + File.ReadAllText(main); File.WriteAllText(output, contents); Utilities.RunExternal("g++", $"{output} -o a.exe"); if (!File.Exists("a.exe")) { throw new Exception("Serializer FAILED to compile."); } else { var serializedInstance = Utilities.RunExternal("a", string.Empty); File.Delete("a.exe"); var tree = JObject.Parse(serializedInstance); var match = JToken.DeepEquals(reference, tree); if (!match) { throw new Exception("Wrong output!"); } } Console.WriteLine("PlainStructs for C++ serializer passed."); }
public void PlainStructs() { var unit = JsonModelBuilder.FromCppFile("PlainStructs.hpp"); var references = new JObject[] { new JObject { ["Name"] = "A", ["Fields"] = new JArray { new JObject { ["Name"] = "a", ["Type"] = "int", ["Access"] = "Public", ["Const"] = false, } } }, new JObject { ["Name"] = "B", ["Fields"] = new JArray { new JObject { ["Name"] = "b", ["Type"] = "int", ["Access"] = "Public", ["Const"] = false, } }, ["Bases"] = new JArray { new JObject { ["Type"] = "struct A", ["Access"] = "Public", } } }, new JObject { ["Name"] = "C", ["Fields"] = new JArray { new JObject { ["Name"] = "c", ["Type"] = "int", ["Access"] = "Public", ["Const"] = false, }, new JObject { ["Name"] = "m", ["Type"] = "struct B", ["Access"] = "Public", ["Const"] = false, } }, }, new JObject { ["Name"] = "D", ["Fields"] = new JArray { new JObject { ["Name"] = "d", ["Type"] = "int", ["Access"] = "Public", ["Const"] = false, }, new JObject { ["Name"] = "x", ["Type"] = "int", ["Access"] = "Private", ["Const"] = false, }, }, ["Bases"] = new JArray { new JObject { ["Type"] = "struct C", ["Access"] = "Public", } }, } }; Utilities.Compare(references, unit["Structs"]); Console.WriteLine("PlainStructs for JSON model passed."); }
public void ClassWithStuff() { var unit = JsonModelBuilder.FromCppFile("ClassWithStuff.hpp"); var references = new JObject[] { new JObject { ["Name"] = "MyClass", ["Fields"] = new JArray { new JObject { ["Name"] = "field", ["Type"] = "int", ["Access"] = "Public", ["Const"] = false, }, new JObject { ["Name"] = "constant", ["Type"] = "const int", ["Access"] = "Public", ["Const"] = true, }, new JObject { ["Name"] = "secret_field", ["Type"] = "int", ["Access"] = "Private", ["Const"] = false, }, }, ["Variables"] = new JArray { new JObject { ["Name"] = "static_field", ["Type"] = "const int", ["Const"] = true, } }, ["Methods"] = new JArray { new JObject { ["Name"] = "method", ["ReturnType"] = "void", ["Const"] = true, ["Virtual"] = true, ["PureVirtual"] = true, ["Static"] = false, ["Access"] = "Public", ["Parameters"] = new JArray(), }, new JObject { ["Name"] = "static_method", ["ReturnType"] = "int", ["Const"] = false, ["Virtual"] = false, ["PureVirtual"] = false, ["Static"] = true, ["Access"] = "Public", ["Parameters"] = new JArray { new JObject { ["Name"] = "abc", ["Type"] = "int", } }, } } }, }; Utilities.Compare(references, unit["Classes"]); var references2 = new JObject[] { new JObject { ["Name"] = "MyClassDerived", ["Bases"] = new JArray { new JObject { ["Type"] = "class MyClass", ["Access"] = "Private" } }, ["TypeParameters"] = new JArray { new JObject { ["Name"] = "T" } }, ["Constructors"] = new JArray { new JObject { ["Access"] = "Public", ["Name"] = "MyClassDerived<T>", ["Parameters"] = new JArray { new JObject { ["Name"] = "a", ["Type"] = "int" } } } } } }; Utilities.Compare(references2, unit["ClassTemplates"]); Console.WriteLine("ClassWithStuff for JSON model passed."); }