]> gitweb.factorcode.org Git - factor.git/blob - extra/parser-combinators/parser-combinators-tests.factor
cf6a731f53be8df7fe852af25e53eaa4c55159ad
[factor.git] / extra / parser-combinators / parser-combinators-tests.factor
1 ! Copyright (C) 2005 Chris Double.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel lists lists.lazy tools.test strings math
4 sequences parser-combinators arrays math.parser unicode.categories ;
5 IN: parser-combinators.tests
6
7 ! Testing <&>
8 { { T{ parse-result f { "a" "b" } T{ slice f 2 4 "abcd" } } }  } [
9   "abcd" "a" token "b" token <&> parse list>array
10 ] unit-test
11
12 { { T{ parse-result f { { "a" "b" } "c" } T{ slice f 3 4 "abcd" } } } } [
13   "abcd" "a" token "b" token <&> "c" token <&> parse list>array
14 ] unit-test
15
16 { { T{ parse-result f { "a" { "b" "c" } } T{ slice f 3 4 "abcd" }  } } } [
17   "abcd" "a" token "b" token "c" token <&> <&> parse list>array
18 ] unit-test
19
20 { { } } [
21   "decd" "a" token "b" token <&> parse list>array
22 ] unit-test
23
24 { { } } [
25   "dbcd" "a" token "b" token <&> parse list>array
26 ] unit-test
27
28 { { } } [
29   "adcd" "a" token "b" token <&> parse list>array
30 ] unit-test
31
32 ! Testing <|>
33 { { T{ parse-result f "a" T{ slice f 1 4 "abcd" } } } } [
34   "abcd" "a" token "b" token <|> parse list>array
35 ] unit-test
36
37 { { T{ parse-result f "b" T{ slice f 1 4 "bbcd" } } }  } [
38   "bbcd" "a" token "b" token <|> parse list>array
39 ] unit-test
40
41 { { } } [
42   "cbcd" "a" token "b" token <|> parse list>array
43 ] unit-test
44
45 ! Testing sp
46 { { } } [
47   "  abcd" "a" token parse list>array
48 ] unit-test
49
50 { { T{ parse-result f "a" T{ slice f 3 6 "  abcd" } } }  } [
51   "  abcd" "a" token sp parse list>array
52 ] unit-test
53
54 ! Testing just
55 { { T{ parse-result f "abcd" T{ slice f 4 4 "abcd" } } T{ parse-result f "abc" T{ slice f 3 4 "abcd" } } } } [
56   "abcd" "abcd" token "abc" token <|> parse list>array
57 ] unit-test
58
59 { { T{ parse-result f "abcd" T{ slice f 4 4 "abcd" } } } } [
60   "abcd" "abcd" token "abc" token <|> just parse list>array
61 ] unit-test
62
63 ! Testing <@
64 { { T{ parse-result f 48 T{ slice f 1 5 "01234" } } } } [
65   "01234" [ digit? ] satisfy parse list>array
66 ] unit-test
67
68 { { T{ parse-result f 0 T{ slice f 1 5 "01234" } } } } [
69   "01234" [ digit? ] satisfy [ digit> ] <@ parse list>array
70 ] unit-test
71
72 ! Testing some
73 { { T{ parse-result f "begin" T{ slice f 5 6 "begin1" } } } } [
74   "begin1" "begin" token parse list>array
75 ] unit-test
76
77 [
78   "begin1" "begin" token some parse
79 ] must-fail
80
81 { "begin" } [
82   "begin" "begin" token some parse
83 ] unit-test
84
85 ! <& parser and &> parser
86 { { T{ parse-result f { "a" "b" } T{ slice f 2 4 "abcd" } } } } [
87   "abcd" "a" token "b" token <&> parse list>array
88 ] unit-test
89
90 { { T{ parse-result f "a" T{ slice f 2 4 "abcd" } } } } [
91   "abcd" "a" token "b" token <& parse list>array
92 ] unit-test
93
94 { { T{ parse-result f "b" T{ slice f 2 4 "abcd" } } } } [
95   "abcd" "a" token "b" token &> parse list>array
96 ] unit-test
97
98 ! Testing <*> and <:&>
99 { { T{ parse-result f { "1" } T{ slice f 1 4 "1234" } } T{ parse-result f { } "1234" } } } [
100   "1234" "1" token <*> parse list>array
101 ] unit-test
102
103 {
104   {
105     T{ parse-result f { "1" "1" "1" "1" } T{ slice f 4 7 "1111234" }  }
106     T{ parse-result f { "1" "1" "1" } T{ slice f 3 7 "1111234" } }
107     T{ parse-result f { "1" "1" } T{ slice f 2 7 "1111234" } }
108     T{ parse-result f { "1" } T{ slice f 1 7 "1111234" } }
109     T{ parse-result f { } "1111234" }
110   }
111
112 } [
113   "1111234" "1" token <*> parse list>array
114 ] unit-test
115
116 {
117   {
118     T{ parse-result f { "1111" } T{ slice f 4 7 "1111234" } }
119     T{ parse-result f { "111" } T{ slice f 3 7 "1111234" } }
120     T{ parse-result f { "11" } T{ slice f 2 7 "1111234" } }
121     T{ parse-result f { "1" } T{ slice f 1 7 "1111234" } }
122     T{ parse-result f { { } } "1111234" }
123   }
124 } [
125   "1111234" "1" token <*> [ concat 1array ] <@ parse list>array
126 ] unit-test
127
128 { { T{ parse-result f { } "234" } } } [
129   "234" "1" token <*> parse list>array
130 ] unit-test
131
132 ! Testing <+>
133 { { T{ parse-result f { "1" } T{ slice f 1 4 "1234" } } } } [
134   "1234" "1" token <+> parse list>array
135 ] unit-test
136
137 {
138   {
139     T{ parse-result f { "1" "1" "1" "1" } T{ slice f 4 7 "1111234" } }
140     T{ parse-result f { "1" "1" "1" }  T{ slice f 3 7 "1111234" } }
141     T{ parse-result f { "1" "1" }  T{ slice f 2 7 "1111234" } }
142     T{ parse-result f { "1" } T{ slice f 1 7 "1111234" } }
143   }
144 } [
145   "1111234" "1" token <+> parse list>array
146 ] unit-test
147
148 { { } } [
149   "234" "1" token <+> parse list>array
150 ] unit-test