private void TestParseCompositeStatementInternal(Func <string, NativeXCompositeStatement> parser) { NativeXCompositeStatement s = parser("{_1();_2();_3();_4();}"); Assert.AreEqual(4, s.Statements.Count); for (int i = 1; i >= 4; i++) { Assert.AreEqual(i.ToString(), ((NativeXReferenceExpression)((NativeXExpressionStatement)s.Statements[i - 1]).Expression).ReferencedName); } }
private void TestParseFunctionDeclarationInternal(Func <string, NativeXFunctionDeclaration> parser) { Action <NativeXFunctionDeclaration> vd_common = d => { Assert.AreEqual("Sum", d.Name); Assert.AreEqual("int", ((NativeXReferenceType)d.ReturnType).ReferencedName); Assert.AreEqual(2, d.Parameters.Count); Assert.AreEqual("int", ((NativeXReferenceType)((NativeXPointerType)d.Parameters[0].Type).ElementType).ReferencedName); Assert.AreEqual("numbers", d.Parameters[0].Name); Assert.AreEqual("int", ((NativeXReferenceType)d.Parameters[1].Type).ReferencedName); Assert.AreEqual("count", d.Parameters[1].Name); }; Action <NativeXFunctionDeclaration> vd1 = d => { Assert.IsFalse(d.Foreign); Assert.IsNull(d.Linking); NativeXCompositeStatement s = (NativeXCompositeStatement)d.Statement; Assert.AreEqual(1, s.Statements.Count); NativeXBinaryExpression e = (NativeXBinaryExpression)((NativeXExpressionStatement)s.Statements[0]).Expression; Assert.IsNotNull((NativeXFunctionResultExpression)e.LeftOperand); Assert.AreEqual("0", ((NativeXPrimitiveExpression)e.RightOperand).Code); }; Action <NativeXFunctionDeclaration> vd2 = d => { Assert.IsFalse(d.Foreign); Assert.IsNull(d.Statement); Assert.AreEqual("Utility", d.Linking.LinkingAssembly); Assert.AreEqual("Sum", d.Linking.LinkingSymbol); }; Action <NativeXFunctionDeclaration> vd3 = d => { Assert.IsTrue(d.Foreign); Assert.IsNull(d.Linking); Assert.IsNull(d.Statement); }; string d1 = "function int Sum(int* numbers, int count){result = 0;}"; string d2 = "function int Sum(int* numbers, int count) alias Utility.Sum;"; string d3 = "foreign function int Sum(int* numbers, int count);"; { NativeXFunctionDeclaration d = parser(d1); vd_common(d); vd1(d); } { NativeXFunctionDeclaration d = parser(d2); vd_common(d); vd2(d); } { NativeXFunctionDeclaration d = parser(d3); vd_common(d); vd3(d); } { NativeXFunctionDeclaration d = parser(g1 + d1); vg1(d); vd_common(d); vd1(d); } { NativeXFunctionDeclaration d = parser(g2 + d2); vg2(d); vd_common(d); vd2(d); } { NativeXFunctionDeclaration d = parser(g3 + d3); vg3(d); vd_common(d); vd3(d); } }