예제 #1
0
        public void FhirPath_Gramm_Expression_Indexer()
        {
            var parser = Grammar.InvocationExpression.End();

            AssertParser.SucceedsMatch(parser, "Patient.name", PATIENTNAME);
            AssertParser.SucceedsMatch(parser, "Patient.name [4 ]",
                                       new IndexerExpression(PATIENTNAME, new ConstantExpression(4)));
            AssertParser.SucceedsMatch(parser, "$this[4].name",
                                       new ChildExpression(
                                           new IndexerExpression(AxisExpression.This, new ConstantExpression(4)),
                                           "name"));

            AssertParser.FailsMatch(parser, "Patient.name[");
            AssertParser.FailsMatch(parser, "Patient.name]");
            AssertParser.FailsMatch(parser, "Patient.name[]");
            AssertParser.FailsMatch(parser, "Patient.name[4,]");
            AssertParser.FailsMatch(parser, "Patient.name[4,5]");
        }
예제 #2
0
        public void FhirPath_Lex_DateTime()
        {
            var parser = Lexer.DateTime.End();

            SucceedsPartialDateTime(parser, "@2015-01");
            SucceedsPartialDateTime(parser, "@2015-01-02T12:34:00Z");
            SucceedsPartialDateTime(parser, "@2015-01-03T12:34:34+02:30");
            SucceedsPartialDateTime(parser, "@2015-01-03T12:34:34");
            //      SucceedsPartialDateTime(parser, "@2015-01-01T23");  TODO: Make this work
            AssertParser.FailsMatch(parser, "@2015-32-02T12:34:00Z");
            AssertParser.FailsMatch(parser, "@2015-01-02T28:34:00Z");
            AssertParser.FailsMatch(parser, "T12:34:34+02:30");
            AssertParser.FailsMatch(parser, "12:34:34+02:30");
            AssertParser.FailsMatch(parser, "@T12:34:34+02:30");
            AssertParser.FailsMatch(parser, "@12:34:34+02:30");
            AssertParser.FailsMatch(parser, "@20150103T12:34:34+02:30");
            AssertParser.FailsMatch(parser, "@-2015-01");
        }
예제 #3
0
        public void FhirPath_Lex_Const()
        {
            var parser = Lexer.ExternalConstant.End();

            SucceedsPrefixString(parser, "%c");
            SucceedsPrefixString(parser, "%const");
            SucceedsPrefixString(parser, "%a1");
            SucceedsPrefixString(parser, "%a__1");
            AssertParser.SucceedsMatch(parser, "%\"forbidden-characters-1234\"", "forbidden-characters-1234");

            AssertParser.FailsMatch(parser, "%0");
            AssertParser.FailsMatch(parser, "%0123");
            AssertParser.FailsMatch(parser, "%");
            AssertParser.FailsMatch(parser, "%%");
            AssertParser.FailsMatch(parser, "%%a");
            AssertParser.FailsMatch(parser, "%-");
            AssertParser.FailsMatch(parser, "%*");
        }
예제 #4
0
        public void FhirPath_Lex_Time()
        {
            var parser = Lexer.Time.End();

            SucceedsTime(parser, "@T12:34:00Z");
            SucceedsTime(parser, "@T12:34:34+02:30");
            SucceedsTime(parser, "@T12:34:34");

            // SucceedsTime(parser, "@T12:35");     TODO: make this work
            // SucceedsTime(parser, "@T12");

            AssertParser.FailsMatch(parser, "2001-01-01T12:34:34+02:30");
            AssertParser.FailsMatch(parser, "@2001-01-01T12:34:34+02:30");
            AssertParser.FailsMatch(parser, "T12:34:34+02:30");
            AssertParser.FailsMatch(parser, "12:34:34+02:30");
            AssertParser.FailsMatch(parser, "@12:34:34+02:30");

            AssertParser.FailsMatch(parser, "@T12:34:34+48:30");
        }
예제 #5
0
        public void FhirPath_Lex_Decimal()
        {
            var parser = Lexer.DecimalNumber.End();

            AssertParser.SucceedsMatch(parser, "3.4", 3.4m);
            // FHIR allows leading zeroes since STU3
            AssertParser.SucceedsMatch(parser, "01.00", 1.00m);
            AssertParser.SucceedsMatch(parser, "3.1415926535897932384626433", 3.1415926535897932384626433m);

            // Shall not accept integer values
            AssertParser.FailsMatch(parser, "3");

            // Test invalid values
            AssertParser.FailsMatch(parser, "");
            AssertParser.FailsMatch(parser, "a0");
            AssertParser.FailsMatch(parser, "0d");
            AssertParser.FailsMatch(parser, "0x0");
            AssertParser.FailsMatch(parser, "0.314+E01");
        }
예제 #6
0
        public void FhirPath_Lex_String()
        {
            var parser = Lexer.String.End();

            SucceedsDelimitedString(parser, @"'single quotes'");
            SucceedsDelimitedString(parser, @"'""single quotes with doubles""'");
            AssertParser.SucceedsMatch(parser, @"'single \' quotes'", @"single ' quotes");
            SucceedsDelimitedString(parser, @"''");

            AssertParser.SucceedsMatch(parser, @"'xxx \u0040 yyy \\\/\f\n\r\t zzz !@#$%^&*()_-=+[]{}|;:,.<>?`~'",
                                       "xxx @ yyy \\/\f\n\r\t zzz " + @"!@#$%^&*()_-=+[]{}|;:,.<>?`~");
            AssertParser.SucceedsMatch(parser, @"'\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b'",
                                       @"\b(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})\b");

            AssertParser.FailsMatch(parser, @"'\q incorrect escape'");
            AssertParser.FailsMatch(parser, @"""double quotes""");
            AssertParser.FailsMatch(parser, @"no quotes");
            AssertParser.FailsMatch(parser, @"""mixed quotes'");
        }
예제 #7
0
        public void FhirPath_Gramm_Literal()
        {
            var parser = Grammar.Literal.End();

            AssertParser.SucceedsMatch(parser, "'hi there'", new ConstantExpression("hi there"));
            var m = new ConstantExpression(3);

            AssertParser.SucceedsMatch(parser, "3", m);
            AssertParser.SucceedsMatch(parser, "3.14", new ConstantExpression(3.14m));
            AssertParser.SucceedsMatch(parser, "@2013-12", new ConstantExpression(P.Date.Parse("2013-12")));
            AssertParser.SucceedsMatch(parser, "@2013-12T", new ConstantExpression(P.DateTime.Parse("2013-12")));
            AssertParser.SucceedsMatch(parser, "@T12:23:34", new ConstantExpression(P.Time.Parse("12:23:34")));
            AssertParser.SucceedsMatch(parser, "true", new ConstantExpression(true));
            AssertParser.SucceedsMatch(parser, "@2014-12-13T12:00:00+02:00", new ConstantExpression(P.DateTime.Parse("2014-12-13T12:00:00+02:00")));

            AssertParser.FailsMatch(parser, "%constant");
            AssertParser.FailsMatch(parser, "`quotedstring`");
            AssertParser.FailsMatch(parser, "A23identifier");
        }
예제 #8
0
        public void FhirPath_Lex_Escape()
        {
            var parser = Lexer.Escape.End();

            AssertParser.SucceedsMatch(parser, @"\uface", "龜");
            AssertParser.SucceedsMatch(parser, @"\'", @"'");
            AssertParser.SucceedsMatch(parser, @"\""", "\"");
            AssertParser.SucceedsMatch(parser, @"\\", @"\");
            AssertParser.SucceedsMatch(parser, @"\/", "/");
            //AssertParser.SucceedsMatch(parser, @"\b"); - removed in STU3
            AssertParser.SucceedsMatch(parser, @"\f", "\f");
            AssertParser.SucceedsMatch(parser, @"\n", "\n");
            AssertParser.SucceedsMatch(parser, @"\r", "\r");
            AssertParser.SucceedsMatch(parser, @"\t", "\t");

            AssertParser.FailsMatch(parser, @"\");
            AssertParser.FailsMatch(parser, @"\ugdef");
            AssertParser.FailsMatch(parser, @"\u01234");
            AssertParser.FailsMatch(parser, @"\x");
        }
        public void FhirPath_Lex_Const()
        {
            var parser = Lexer.ExternalConstant.End();

            succeedsPrefixString(parser, "%c");
            succeedsPrefixString(parser, "%const");
            succeedsPrefixString(parser, "%a1");
            succeedsPrefixString(parser, "%a__1");
            AssertParser.SucceedsMatch(parser, "%`forbidden-characters-1234`", "forbidden-characters-1234");
            AssertParser.SucceedsMatch(parser, "%\"forbidden-characters-1234\"", "forbidden-characters-1234"); // still support the old syntax
            AssertParser.SucceedsMatch(parser, "%'forbidden-characters-1234'", "forbidden-characters-1234");   // new normative %<STRING>

            AssertParser.FailsMatch(parser, "%0");
            AssertParser.FailsMatch(parser, "%0123");
            AssertParser.FailsMatch(parser, "%");
            AssertParser.FailsMatch(parser, "%%");
            AssertParser.FailsMatch(parser, "%%a");
            AssertParser.FailsMatch(parser, "%-");
            AssertParser.FailsMatch(parser, "%*");
        }
        public void FhirPath_Lex_QuotedIdentifier()
        {
            var parser = Lexer.DelimitedIdentifier.End();

            succeedsDelimitedString(parser, "`2a`");
            succeedsDelimitedString(parser, "`_`");
            succeedsDelimitedString(parser, "`_Abcdef_ghijklmnopqrstuvwxyz_`");
            succeedsDelimitedString(parser, "`Hi \uface`");
            succeedsDelimitedString(parser, "`@#$%^&*().'`");
            succeedsDelimitedString(parser, "`3.1415`");

            AssertParser.SucceedsMatch(parser, "`A\uface%$#34`", "A\uface%$#34");
            AssertParser.SucceedsMatch(parser, "`A\"quote`", "A\"quote");
            AssertParser.SucceedsMatch(parser, "\"A`quote\"", "A`quote");
            AssertParser.SucceedsMatch(parser, "`A\\`quote`", "A`quote");
            AssertParser.SucceedsMatch(parser, "\"A\\\"quote\"", "A\"quote");

            AssertParser.FailsMatch(parser, "NoQuotes");
            AssertParser.FailsMatch(parser, @"'wrong es\qape'");
        }
        public void FhirPath_Lex_Escape()
        {
            var parser = Lexer.Escape.End();

            AssertParser.SucceedsMatch(parser, @"\uface", "ялО");
            AssertParser.SucceedsMatch(parser, @"\'", @"'");
            AssertParser.SucceedsMatch(parser, @"\`", "`");
            AssertParser.SucceedsMatch(parser, "\\\"", "\"");  // \" === "
            AssertParser.SucceedsMatch(parser, @"\\", @"\");
            AssertParser.SucceedsMatch(parser, @"\/", "/");
            AssertParser.SucceedsMatch(parser, @"\f", "\f");
            AssertParser.SucceedsMatch(parser, @"\n", "\n");
            AssertParser.SucceedsMatch(parser, @"\r", "\r");
            AssertParser.SucceedsMatch(parser, @"\t", "\t");

            AssertParser.FailsMatch(parser, @"\");
            AssertParser.FailsMatch(parser, @"\ugdef");
            AssertParser.FailsMatch(parser, @"\u01234");
            AssertParser.FailsMatch(parser, @"\x");
            AssertParser.FailsMatch(parser, @"\b");
        }
        public void FhirPath_Lex_Time()
        {
            var parser = Lexer.Time.End();

            accept("@T12:34:34.345674");
            accept("@T12:34:34");
            accept("@T12:35");
            accept("@T12");

            reject("@T12:34:34+02:30");
            reject("@T12:34:00Z");
            reject("2001-01-01T12:34:34+02:30");
            reject("@2001-01-01T12:34:34+02:30");
            reject("T12:34:34+02:30");
            reject("12:34:34+02:30");
            reject("@12:34:34+02:30");
            reject("@T12:34:34+48:30");

            void accept(string s) => AssertParser.SucceedsMatch(parser, s, P.Time.Parse(s.Substring(2)));
            void reject(string s) => AssertParser.FailsMatch(parser, s);
        }
예제 #13
0
        public void FhirPath_Gramm_Invocation()
        {
            var parser = Grammar.InvocationExpression.End();

            AssertParser.SucceedsMatch(parser, "childname", new ChildExpression(AxisExpression.That, "childname"));
            // AssertParser.SucceedsMatch(parser, "$this", AxisExpression.This);

            AssertParser.SucceedsMatch(parser, "doSomething()", new FunctionCallExpression(AxisExpression.That, "doSomething", TypeSpecifier.Any));
            AssertParser.SucceedsMatch(parser, "doSomething ( ) ", new FunctionCallExpression(AxisExpression.That, "doSomething", TypeSpecifier.Any));
            AssertParser.SucceedsMatch(parser, "doSomething ( 3.14 ) ", new FunctionCallExpression(AxisExpression.That, "doSomething", TypeSpecifier.Any,
                                                                                                   new ConstantExpression(3.14m)));

            AssertParser.SucceedsMatch(parser, "doSomething('hi', 3.14, 3, $this, somethingElse(true))", new FunctionCallExpression(AxisExpression.That, "doSomething", TypeSpecifier.Any,
                                                                                                                                    new ConstantExpression("hi"), new ConstantExpression(3.14m), new ConstantExpression(3L),
                                                                                                                                    AxisExpression.This,
                                                                                                                                    new FunctionCallExpression(AxisExpression.That, "somethingElse", TypeSpecifier.Any, new ConstantExpression(true))));

            AssertParser.SucceedsMatch(parser, "as(Patient)", new FunctionCallExpression(AxisExpression.That, "as", TypeSpecifier.Any, new ConstantExpression("Patient")));

            AssertParser.FailsMatch(parser, "$that");
            //     AssertParser.FailsMatch(parser, "as(Patient.identifier)");
            AssertParser.FailsMatch(parser, "as('Patient')");
            AssertParser.FailsMatch(parser, "doSomething(");
        }