DotNet bindings mostly work

This commit is contained in:
Dan Hirsch 2013-12-19 18:40:59 +01:00
parent 14a5c5c1ef
commit feaf1a7e06
7 changed files with 239 additions and 93 deletions

View file

@ -13,14 +13,14 @@ namespace Hammer.Test {
public void TestCh() {
Parser parser;
parser = Hammer.Ch(0xa2);
CheckParseOK(parser, "\xa2", (System.Char)'\xa2');
CheckParseOK(parser, "\xa2", (System.UInt64)'\xa2');
CheckParseFail(parser, "\xa3");
}
[Test]
public void TestCh_range() {
Parser parser;
parser = Hammer.Ch_range(0x61, 0x63);
CheckParseOK(parser, "b", (System.Char)'b');
CheckParseOK(parser, "b", (System.UInt64)'b');
CheckParseFail(parser, "d");
}
[Test]
@ -94,10 +94,10 @@ namespace Hammer.Test {
public void TestWhitespace() {
Parser parser;
parser = Hammer.Whitespace(Hammer.Ch(0x61));
CheckParseOK(parser, "a", (System.Char)'a');
CheckParseOK(parser, " a", (System.Char)'a');
CheckParseOK(parser, " a", (System.Char)'a');
CheckParseOK(parser, "\x09a", (System.Char)'a');
CheckParseOK(parser, "a", (System.UInt64)'a');
CheckParseOK(parser, " a", (System.UInt64)'a');
CheckParseOK(parser, " a", (System.UInt64)'a');
CheckParseOK(parser, "\x09a", (System.UInt64)'a');
CheckParseFail(parser, "_a");
parser = Hammer.Whitespace(Hammer.End_p());
CheckParseOK(parser, "", null);
@ -108,7 +108,7 @@ namespace Hammer.Test {
public void TestLeft() {
Parser parser;
parser = Hammer.Left(Hammer.Ch(0x61), Hammer.Ch(0x20));
CheckParseOK(parser, "a ", (System.Char)'a');
CheckParseOK(parser, "a ", (System.UInt64)'a');
CheckParseFail(parser, "a");
CheckParseFail(parser, " ");
CheckParseFail(parser, "ba");
@ -117,7 +117,7 @@ namespace Hammer.Test {
public void TestMiddle() {
Parser parser;
parser = Hammer.Middle(Hammer.Ch(' '), Hammer.Ch('a'), Hammer.Ch(' '));
CheckParseOK(parser, " a ", (System.Char)'a');
CheckParseOK(parser, " a ", (System.UInt64)'a');
CheckParseFail(parser, "a");
CheckParseFail(parser, " a");
CheckParseFail(parser, "a ");
@ -129,21 +129,21 @@ namespace Hammer.Test {
public void TestIn() {
Parser parser;
parser = Hammer.In("abc");
CheckParseOK(parser, "b", (System.Char)'b');
CheckParseOK(parser, "b", (System.UInt64)'b');
CheckParseFail(parser, "d");
}
[Test]
public void TestNot_in() {
Parser parser;
parser = Hammer.Not_in("abc");
CheckParseOK(parser, "d", (System.Char)'d');
CheckParseOK(parser, "d", (System.UInt64)'d');
CheckParseFail(parser, "a");
}
[Test]
public void TestEnd_p() {
Parser parser;
parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.End_p());
CheckParseOK(parser, "a", new object[]{ (System.Char)'a'});
CheckParseOK(parser, "a", new object[]{ (System.UInt64)'a'});
CheckParseFail(parser, "aa");
}
[Test]
@ -156,32 +156,32 @@ namespace Hammer.Test {
public void TestSequence() {
Parser parser;
parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Ch('b'));
CheckParseOK(parser, "ab", new object[]{ (System.Char)'a', (System.Char)'b'});
CheckParseOK(parser, "ab", new object[]{ (System.UInt64)'a', (System.UInt64)'b'});
CheckParseFail(parser, "a");
CheckParseFail(parser, "b");
parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Whitespace(Hammer.Ch('b')));
CheckParseOK(parser, "ab", new object[]{ (System.Char)'a', (System.Char)'b'});
CheckParseOK(parser, "a b", new object[]{ (System.Char)'a', (System.Char)'b'});
CheckParseOK(parser, "a b", new object[]{ (System.Char)'a', (System.Char)'b'});
CheckParseOK(parser, "ab", new object[]{ (System.UInt64)'a', (System.UInt64)'b'});
CheckParseOK(parser, "a b", new object[]{ (System.UInt64)'a', (System.UInt64)'b'});
CheckParseOK(parser, "a b", new object[]{ (System.UInt64)'a', (System.UInt64)'b'});
}
[Test]
public void TestChoice() {
Parser parser;
parser = Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('b'));
CheckParseOK(parser, "a", (System.Char)'a');
CheckParseOK(parser, "b", (System.Char)'b');
CheckParseOK(parser, "ab", (System.Char)'a');
CheckParseOK(parser, "a", (System.UInt64)'a');
CheckParseOK(parser, "b", (System.UInt64)'b');
CheckParseOK(parser, "ab", (System.UInt64)'a');
CheckParseFail(parser, "c");
}
[Test]
public void TestButnot() {
Parser parser;
parser = Hammer.Butnot(Hammer.Ch('a'), Hammer.Token("ab"));
CheckParseOK(parser, "a", (System.Char)'a');
CheckParseOK(parser, "a", (System.UInt64)'a');
CheckParseFail(parser, "ab");
CheckParseOK(parser, "aa", (System.Char)'a');
CheckParseOK(parser, "aa", (System.UInt64)'a');
parser = Hammer.Butnot(Hammer.Ch_range('0', '9'), Hammer.Ch('6'));
CheckParseOK(parser, "5", (System.Char)'5');
CheckParseOK(parser, "5", (System.UInt64)'5');
CheckParseFail(parser, "6");
}
[Test]
@ -195,8 +195,8 @@ namespace Hammer.Test {
public void TestXor() {
Parser parser;
parser = Hammer.Xor(Hammer.Ch_range('0', '6'), Hammer.Ch_range('5', '9'));
CheckParseOK(parser, "0", (System.Char)'0');
CheckParseOK(parser, "9", (System.Char)'9');
CheckParseOK(parser, "0", (System.UInt64)'0');
CheckParseOK(parser, "9", (System.UInt64)'9');
CheckParseFail(parser, "5");
CheckParseFail(parser, "a");
}
@ -205,18 +205,18 @@ namespace Hammer.Test {
Parser parser;
parser = Hammer.Many(Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('b')));
CheckParseOK(parser, "", new object[]{ });
CheckParseOK(parser, "a", new object[]{ (System.Char)'a'});
CheckParseOK(parser, "b", new object[]{ (System.Char)'b'});
CheckParseOK(parser, "aabbaba", new object[]{ (System.Char)'a', (System.Char)'a', (System.Char)'b', (System.Char)'b', (System.Char)'a', (System.Char)'b', (System.Char)'a'});
CheckParseOK(parser, "a", new object[]{ (System.UInt64)'a'});
CheckParseOK(parser, "b", new object[]{ (System.UInt64)'b'});
CheckParseOK(parser, "aabbaba", new object[]{ (System.UInt64)'a', (System.UInt64)'a', (System.UInt64)'b', (System.UInt64)'b', (System.UInt64)'a', (System.UInt64)'b', (System.UInt64)'a'});
}
[Test]
public void TestMany1() {
Parser parser;
parser = Hammer.Many1(Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('b')));
CheckParseFail(parser, "");
CheckParseOK(parser, "a", new object[]{ (System.Char)'a'});
CheckParseOK(parser, "b", new object[]{ (System.Char)'b'});
CheckParseOK(parser, "aabbaba", new object[]{ (System.Char)'a', (System.Char)'a', (System.Char)'b', (System.Char)'b', (System.Char)'a', (System.Char)'b', (System.Char)'a'});
CheckParseOK(parser, "a", new object[]{ (System.UInt64)'a'});
CheckParseOK(parser, "b", new object[]{ (System.UInt64)'b'});
CheckParseOK(parser, "aabbaba", new object[]{ (System.UInt64)'a', (System.UInt64)'a', (System.UInt64)'b', (System.UInt64)'b', (System.UInt64)'a', (System.UInt64)'b', (System.UInt64)'a'});
CheckParseFail(parser, "daabbabadef");
}
[Test]
@ -224,16 +224,16 @@ namespace Hammer.Test {
Parser parser;
parser = Hammer.Repeat_n(Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('b')), 0x2);
CheckParseFail(parser, "adef");
CheckParseOK(parser, "abdef", new object[]{ (System.Char)'a', (System.Char)'b'});
CheckParseOK(parser, "abdef", new object[]{ (System.UInt64)'a', (System.UInt64)'b'});
CheckParseFail(parser, "dabdef");
}
[Test]
public void TestOptional() {
Parser parser;
parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Optional(Hammer.Choice(Hammer.Ch('b'), Hammer.Ch('c'))), Hammer.Ch('d'));
CheckParseOK(parser, "abd", new object[]{ (System.Char)'a', (System.Char)'b', (System.Char)'d'});
CheckParseOK(parser, "acd", new object[]{ (System.Char)'a', (System.Char)'c', (System.Char)'d'});
CheckParseOK(parser, "ad", new object[]{ (System.Char)'a', null, (System.Char)'d'});
CheckParseOK(parser, "abd", new object[]{ (System.UInt64)'a', (System.UInt64)'b', (System.UInt64)'d'});
CheckParseOK(parser, "acd", new object[]{ (System.UInt64)'a', (System.UInt64)'c', (System.UInt64)'d'});
CheckParseOK(parser, "ad", new object[]{ (System.UInt64)'a', null, (System.UInt64)'d'});
CheckParseFail(parser, "aed");
CheckParseFail(parser, "ab");
CheckParseFail(parser, "ac");
@ -242,61 +242,51 @@ namespace Hammer.Test {
public void TestIgnore() {
Parser parser;
parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Ignore(Hammer.Ch('b')), Hammer.Ch('c'));
CheckParseOK(parser, "abc", new object[]{ (System.Char)'a', (System.Char)'c'});
CheckParseOK(parser, "abc", new object[]{ (System.UInt64)'a', (System.UInt64)'c'});
CheckParseFail(parser, "ac");
}
[Test]
public void TestSepBy() {
Parser parser;
parser = Hammer.SepBy(Hammer.Choice(Hammer.Ch('1'), Hammer.Ch('2'), Hammer.Ch('3')), Hammer.Ch(','));
CheckParseOK(parser, "1,2,3", new object[]{ (System.Char)'1', (System.Char)'2', (System.Char)'3'});
CheckParseOK(parser, "1,3,2", new object[]{ (System.Char)'1', (System.Char)'3', (System.Char)'2'});
CheckParseOK(parser, "1,3", new object[]{ (System.Char)'1', (System.Char)'3'});
CheckParseOK(parser, "3", new object[]{ (System.Char)'3'});
CheckParseOK(parser, "1,2,3", new object[]{ (System.UInt64)'1', (System.UInt64)'2', (System.UInt64)'3'});
CheckParseOK(parser, "1,3,2", new object[]{ (System.UInt64)'1', (System.UInt64)'3', (System.UInt64)'2'});
CheckParseOK(parser, "1,3", new object[]{ (System.UInt64)'1', (System.UInt64)'3'});
CheckParseOK(parser, "3", new object[]{ (System.UInt64)'3'});
CheckParseOK(parser, "", new object[]{ });
}
[Test]
public void TestSepBy1() {
Parser parser;
parser = Hammer.SepBy1(Hammer.Choice(Hammer.Ch('1'), Hammer.Ch('2'), Hammer.Ch('3')), Hammer.Ch(','));
CheckParseOK(parser, "1,2,3", new object[]{ (System.Char)'1', (System.Char)'2', (System.Char)'3'});
CheckParseOK(parser, "1,3,2", new object[]{ (System.Char)'1', (System.Char)'3', (System.Char)'2'});
CheckParseOK(parser, "1,3", new object[]{ (System.Char)'1', (System.Char)'3'});
CheckParseOK(parser, "3", new object[]{ (System.Char)'3'});
CheckParseOK(parser, "1,2,3", new object[]{ (System.UInt64)'1', (System.UInt64)'2', (System.UInt64)'3'});
CheckParseOK(parser, "1,3,2", new object[]{ (System.UInt64)'1', (System.UInt64)'3', (System.UInt64)'2'});
CheckParseOK(parser, "1,3", new object[]{ (System.UInt64)'1', (System.UInt64)'3'});
CheckParseOK(parser, "3", new object[]{ (System.UInt64)'3'});
CheckParseFail(parser, "");
}
[Test]
public void TestAnd() {
Parser parser;
parser = Hammer.Sequence(Hammer.And(Hammer.Ch('0')), Hammer.Ch('0'));
CheckParseOK(parser, "0", new object[]{ (System.Char)'0'});
CheckParseOK(parser, "0", new object[]{ (System.UInt64)'0'});
CheckParseFail(parser, "1");
parser = Hammer.Sequence(Hammer.And(Hammer.Ch('0')), Hammer.Ch('1'));
CheckParseFail(parser, "0");
CheckParseFail(parser, "1");
parser = Hammer.Sequence(Hammer.Ch('1'), Hammer.And(Hammer.Ch('2')));
CheckParseOK(parser, "12", new object[]{ (System.Char)'1'});
CheckParseOK(parser, "12", new object[]{ (System.UInt64)'1'});
CheckParseFail(parser, "13");
}
[Test]
public void TestNot() {
Parser parser;
parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Choice(Hammer.Token("+"), Hammer.Token("++")), Hammer.Ch('b'));
CheckParseOK(parser, "a+b", new object[]{ (System.Char)'a', new byte[]{ 0x2b}, (System.Char)'b'});
CheckParseOK(parser, "a+b", new object[]{ (System.UInt64)'a', new byte[]{ 0x2b}, (System.UInt64)'b'});
CheckParseFail(parser, "a++b");
parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Choice(Hammer.Sequence(Hammer.Token("+"), Hammer.Not(Hammer.Ch('+'))), Hammer.Token("++")), Hammer.Ch('b'));
CheckParseOK(parser, "a+b", new object[]{ (System.Char)'a', new object[]{ new byte[]{ 0x2b}}, (System.Char)'b'});
CheckParseOK(parser, "a++b", new object[]{ (System.Char)'a', new byte[]{ 0x2b, 0x2b}, (System.Char)'b'});
}
[Test]
public void TestLeftrec() {
Parser parser;
IndirectParser sp_lr = Hammer.Indirect();
sp_lr.Bind(Hammer.Choice(Hammer.Sequence(sp_lr, Hammer.Ch('a')), Hammer.Epsilon_p()));
parser = sp_lr;
CheckParseOK(parser, "a", new object[]{ (System.Char)'a'});
CheckParseOK(parser, "aa", new object[]{ new object[]{ (System.Char)'a'}, (System.Char)'a'});
CheckParseOK(parser, "aaa", new object[]{ new object[]{ new object[]{ (System.Char)'a'}, (System.Char)'a'}, (System.Char)'a'});
CheckParseOK(parser, "a+b", new object[]{ (System.UInt64)'a', new object[]{ new byte[]{ 0x2b}}, (System.UInt64)'b'});
CheckParseOK(parser, "a++b", new object[]{ (System.UInt64)'a', new byte[]{ 0x2b, 0x2b}, (System.UInt64)'b'});
}
[Test]
public void TestRightrec() {
@ -304,9 +294,9 @@ namespace Hammer.Test {
IndirectParser sp_rr = Hammer.Indirect();
sp_rr.Bind(Hammer.Choice(Hammer.Sequence(Hammer.Ch('a'), sp_rr), Hammer.Epsilon_p()));
parser = sp_rr;
CheckParseOK(parser, "a", new object[]{ (System.Char)'a'});
CheckParseOK(parser, "aa", new object[]{ (System.Char)'a', new object[]{ (System.Char)'a'}});
CheckParseOK(parser, "aaa", new object[]{ (System.Char)'a', new object[]{ (System.Char)'a', new object[]{ (System.Char)'a'}}});
CheckParseOK(parser, "a", new object[]{ (System.UInt64)'a'});
CheckParseOK(parser, "aa", new object[]{ (System.UInt64)'a', new object[]{ (System.UInt64)'a'}});
CheckParseOK(parser, "aaa", new object[]{ (System.UInt64)'a', new object[]{ (System.UInt64)'a', new object[]{ (System.UInt64)'a'}}});
}
[Test]
public void TestAmbiguous() {
@ -318,9 +308,9 @@ namespace Hammer.Test {
sp_p.Bind(Hammer.Ch('+'));
sp_e.Bind(Hammer.Choice(Hammer.Sequence(sp_e, sp_p, sp_e), sp_d));
parser = sp_e;
CheckParseOK(parser, "d", (System.Char)'d');
CheckParseOK(parser, "d+d", new object[]{ (System.Char)'d', (System.Char)'+', (System.Char)'d'});
CheckParseOK(parser, "d+d+d", new object[]{ new object[]{ (System.Char)'d', (System.Char)'+', (System.Char)'d'}, (System.Char)'+', (System.Char)'d'});
CheckParseOK(parser, "d", (System.UInt64)'d');
CheckParseOK(parser, "d+d", new object[]{ (System.UInt64)'d', (System.UInt64)'+', (System.UInt64)'d'});
CheckParseOK(parser, "d+d+d", new object[]{ new object[]{ (System.UInt64)'d', (System.UInt64)'+', (System.UInt64)'d'}, (System.UInt64)'+', (System.UInt64)'d'});
}
}
}