private void TestParseConceptDeclarationInternal(Func <string, NativeXConceptDeclaration> parser) { Action <NativeXType> vt = t => { NativeXFunctionType ft = (NativeXFunctionType)t; Assert.AreEqual("bool", ((NativeXReferenceType)ft.ReturnType).ReferencedName); Assert.AreEqual(2, ft.Parameters.Count); Assert.AreEqual("int", ((NativeXReferenceType)ft.Parameters[0]).ReferencedName); Assert.AreEqual("int", ((NativeXReferenceType)ft.Parameters[1]).ReferencedName); }; Action <NativeXConceptDeclaration> vd_common = d => { Assert.AreEqual("Eq", d.Name); Assert.AreEqual("T", d.ConceptType.ParameterName); Assert.AreEqual(2, d.Functions.Count); Assert.AreEqual("Equal", d.Functions[0].Name); vt(d.Functions[0].Type); Assert.AreEqual("NotEqual", d.Functions[1].Name); vt(d.Functions[1].Type); }; Action <NativeXConceptDeclaration> vd1 = d => { Assert.IsNull(d.Linking); }; Action <NativeXConceptDeclaration> vd2 = d => { Assert.AreEqual("Utility", d.Linking.LinkingAssembly); Assert.AreEqual("Eq", d.Linking.LinkingSymbol); }; string d1 = "concept T : Eq{Equal = function bool(int,int); NotEqual = function bool(int,int);}"; string d2 = "concept T : Eq alias Utility.Eq{Equal = function bool(int,int); NotEqual = function bool(int,int);}"; { NativeXConceptDeclaration d = parser(d1); vd_common(d); vd1(d); } { NativeXConceptDeclaration d = parser(d2); vd_common(d); vd2(d); } { NativeXConceptDeclaration d = parser(g1 + d1); vg1(d); vd_common(d); vd1(d); } { NativeXConceptDeclaration d = parser(g2 + d2); vg2(d); vd_common(d); vd2(d); } }
private void TestParseVariableStatementInternal(Func <string, NativeXVariableStatement> parser) { { NativeXVariableStatement s = parser("variable function int(double) converter;"); Assert.AreEqual("converter", s.Name); Assert.IsNull(s.Initializer); NativeXFunctionType t = (NativeXFunctionType)s.Type; Assert.AreEqual("int", ((NativeXReferenceType)t.ReturnType).ReferencedName); Assert.AreEqual(1, t.Parameters.Count); Assert.AreEqual("double", ((NativeXReferenceType)t.Parameters[0]).ReferencedName); } { NativeXVariableStatement s = parser("variable vector<string> list = null;"); Assert.AreEqual("list", s.Name); Assert.AreEqual("null", ((NativeXPrimitiveExpression)s.Initializer).Code); NativeXInstanciatedType t = (NativeXInstanciatedType)s.Type; Assert.AreEqual("vector", ((NativeXReferenceType)t.ElementType).ReferencedName); Assert.AreEqual(1, t.GenericArguments.Count); Assert.AreEqual("string", ((NativeXReferenceType)t.GenericArguments[0]).ReferencedName); } }
private void TestFunctionTypeInternal(Func <string, NativeXFunctionType> parser) { { NativeXFunctionType t = parser("function void()"); Assert.AreEqual("void", ((NativeXReferenceType)t.ReturnType).ReferencedName); Assert.AreEqual(0, t.Parameters.Count); } { NativeXFunctionType t = parser("function int(double*)"); Assert.AreEqual("int", ((NativeXReferenceType)t.ReturnType).ReferencedName); Assert.AreEqual(1, t.Parameters.Count); Assert.AreEqual("double", ((NativeXReferenceType)((NativeXPointerType)t.Parameters[0]).ElementType).ReferencedName); } { NativeXFunctionType t = parser("function int(double*,string[1])"); Assert.AreEqual("int", ((NativeXReferenceType)t.ReturnType).ReferencedName); Assert.AreEqual(2, t.Parameters.Count); Assert.AreEqual("double", ((NativeXReferenceType)((NativeXPointerType)t.Parameters[0]).ElementType).ReferencedName); Assert.AreEqual("string", ((NativeXReferenceType)((NativeXArrayType)t.Parameters[1]).ElementType).ReferencedName); } }