nexus_parser 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/lexer.rb +4 -4
- data/lib/{nexus_file.rb → nexus_parser.rb} +20 -21
- data/lib/parser.rb +92 -92
- data/lib/tokens.rb +40 -40
- data/nexus_parser.gemspec +61 -0
- data/test/MX_test_03.nex +234 -234
- data/test/test_nexus_parser.rb +210 -213
- metadata +5 -4
data/test/test_nexus_parser.rb
CHANGED
@@ -2,7 +2,7 @@ require 'test/unit'
|
|
2
2
|
require 'rubygems'
|
3
3
|
require 'ruby-debug'
|
4
4
|
|
5
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/nexus_parser'))
|
6
6
|
|
7
7
|
class NexusParserTest < Test::Unit::TestCase
|
8
8
|
def test_truth
|
@@ -10,9 +10,9 @@ class NexusParserTest < Test::Unit::TestCase
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
class
|
13
|
+
class Test_NexusParser_Builder < Test::Unit::TestCase
|
14
14
|
def test_builder
|
15
|
-
b =
|
15
|
+
b = NexusParser::Builder.new
|
16
16
|
assert foo = b.nexus_file
|
17
17
|
assert_equal [], foo.taxa
|
18
18
|
assert_equal [], foo.characters
|
@@ -34,221 +34,221 @@ end
|
|
34
34
|
|
35
35
|
class Test_Lexer < Test::Unit::TestCase
|
36
36
|
def test_lexer
|
37
|
-
lexer =
|
38
|
-
assert lexer.pop(
|
39
|
-
assert id = lexer.pop(
|
37
|
+
lexer = NexusParser::Lexer.new("[ foo ] BEGIN taxa; BLORF end;")
|
38
|
+
assert lexer.pop(NexusParser::Tokens::LBracket)
|
39
|
+
assert id = lexer.pop(NexusParser::Tokens::ID)
|
40
40
|
assert_equal(id.value, "foo")
|
41
|
-
assert lexer.pop(
|
42
|
-
assert lexer.pop(
|
43
|
-
assert lexer.pop(
|
44
|
-
assert foo = lexer.pop(
|
41
|
+
assert lexer.pop(NexusParser::Tokens::RBracket)
|
42
|
+
assert lexer.pop(NexusParser::Tokens::BeginBlk)
|
43
|
+
assert lexer.pop(NexusParser::Tokens::TaxaBlk)
|
44
|
+
assert foo = lexer.pop(NexusParser::Tokens::ID)
|
45
45
|
assert_equal("BLORF", foo.value) # truncating whitespace
|
46
|
-
assert lexer.pop(
|
46
|
+
assert lexer.pop(NexusParser::Tokens::BlkEnd)
|
47
47
|
|
48
|
-
lexer2 =
|
49
|
-
assert lexer2.pop(
|
50
|
-
assert id = lexer2.pop(
|
48
|
+
lexer2 = NexusParser::Lexer.new("[ foo ] begin authors; BLORF end; [] () some crud here")
|
49
|
+
assert lexer2.pop(NexusParser::Tokens::LBracket)
|
50
|
+
assert id = lexer2.pop(NexusParser::Tokens::ID)
|
51
51
|
assert_equal(id.value, "foo")
|
52
|
-
assert lexer2.pop(
|
53
|
-
assert lexer2.pop(
|
54
|
-
assert lexer2.pop(
|
55
|
-
assert lexer2.pop(
|
56
|
-
assert lexer2.pop(
|
57
|
-
assert lexer2.pop(
|
58
|
-
assert lexer2.pop(
|
59
|
-
|
60
|
-
|
61
|
-
lexer3 =
|
62
|
-
assert lexer3.pop(
|
63
|
-
assert id = lexer3.pop(
|
52
|
+
assert lexer2.pop(NexusParser::Tokens::RBracket)
|
53
|
+
assert lexer2.pop(NexusParser::Tokens::BeginBlk)
|
54
|
+
assert lexer2.pop(NexusParser::Tokens::AuthorsBlk)
|
55
|
+
assert lexer2.pop(NexusParser::Tokens::LBracket)
|
56
|
+
assert lexer2.pop(NexusParser::Tokens::RBracket)
|
57
|
+
assert lexer2.pop(NexusParser::Tokens::LParen)
|
58
|
+
assert lexer2.pop(NexusParser::Tokens::RParen)
|
59
|
+
|
60
|
+
|
61
|
+
lexer3 = NexusParser::Lexer.new("[ foo ] Begin Characters; BLORF end; [] () some crud here")
|
62
|
+
assert lexer3.pop(NexusParser::Tokens::LBracket)
|
63
|
+
assert id = lexer3.pop(NexusParser::Tokens::ID)
|
64
64
|
assert_equal(id.value, "foo")
|
65
|
-
assert lexer3.pop(
|
66
|
-
assert lexer3.pop(
|
67
|
-
assert lexer3.pop(
|
68
|
-
assert foo = lexer3.pop(
|
65
|
+
assert lexer3.pop(NexusParser::Tokens::RBracket)
|
66
|
+
assert lexer3.pop(NexusParser::Tokens::BeginBlk)
|
67
|
+
assert lexer3.pop(NexusParser::Tokens::ChrsBlk)
|
68
|
+
assert foo = lexer3.pop(NexusParser::Tokens::ID)
|
69
69
|
assert_equal("BLORF", foo.value)
|
70
|
-
assert lexer3.pop(
|
70
|
+
assert lexer3.pop(NexusParser::Tokens::BlkEnd)
|
71
71
|
|
72
|
-
lexer4 =
|
73
|
-
assert lexer4.pop(
|
74
|
-
assert lexer4.pop(
|
75
|
-
assert foo = lexer4.pop(
|
72
|
+
lexer4 = NexusParser::Lexer.new("Begin Characters; 123123123 end; [] () some crud here")
|
73
|
+
assert lexer4.pop(NexusParser::Tokens::BeginBlk)
|
74
|
+
assert lexer4.pop(NexusParser::Tokens::ChrsBlk)
|
75
|
+
assert foo = lexer4.pop(NexusParser::Tokens::Number)
|
76
76
|
assert_equal(123123123, foo.value)
|
77
|
-
assert lexer4.pop(
|
77
|
+
assert lexer4.pop(NexusParser::Tokens::BlkEnd)
|
78
78
|
|
79
|
-
lexer5 =
|
80
|
-
assert lexer5.pop(
|
81
|
-
assert foo = lexer5.pop(
|
79
|
+
lexer5 = NexusParser::Lexer.new("(0,1)")
|
80
|
+
assert lexer5.pop(NexusParser::Tokens::LParen)
|
81
|
+
assert foo = lexer5.pop(NexusParser::Tokens::Number)
|
82
82
|
assert_equal(0, foo.value)
|
83
|
-
assert lexer5.pop(
|
84
|
-
assert foo = lexer5.pop(
|
83
|
+
assert lexer5.pop(NexusParser::Tokens::Comma)
|
84
|
+
assert foo = lexer5.pop(NexusParser::Tokens::Number)
|
85
85
|
assert_equal(1, foo.value)
|
86
|
-
assert lexer5.pop(
|
86
|
+
assert lexer5.pop(NexusParser::Tokens::RParen)
|
87
87
|
|
88
|
-
lexer6 =
|
89
|
-
assert foo = lexer6.pop(
|
88
|
+
lexer6 = NexusParser::Lexer.new(" 210(0,1)10A1\n")
|
89
|
+
assert foo = lexer6.pop(NexusParser::Tokens::RowVec)
|
90
90
|
assert_equal(["2","1","0",["0","1"],"1","0","A","1"], foo.value)
|
91
91
|
|
92
|
-
lexer6a =
|
93
|
-
assert foo = lexer6a.pop(
|
92
|
+
lexer6a = NexusParser::Lexer.new(" 21a(0 1)0b{3 4 5}(0)(1 a)\n")
|
93
|
+
assert foo = lexer6a.pop(NexusParser::Tokens::RowVec)
|
94
94
|
assert_equal(["2", "1", "a", ["0", "1"], "0", "b", ["3", "4", "5"], "0", ["1", "a"]], foo.value)
|
95
95
|
|
96
|
-
lexer6b =
|
97
|
-
assert foo = lexer6b.pop(
|
96
|
+
lexer6b = NexusParser::Lexer.new(" 201{0 1}{0 1}0100)\x0A") # *nix line ending
|
97
|
+
assert foo = lexer6b.pop(NexusParser::Tokens::RowVec)
|
98
98
|
assert_equal(["2", "0", "1", ["0", "1"], ["0", "1"], "0", "1", "0", "0"], foo.value)
|
99
99
|
|
100
|
-
lexer6c =
|
101
|
-
assert foo = lexer6c.pop(
|
100
|
+
lexer6c = NexusParser::Lexer.new(" 201{0 1}{0 1}0100)\x0D\x0A") # * dos line ending
|
101
|
+
assert foo = lexer6c.pop(NexusParser::Tokens::RowVec)
|
102
102
|
assert_equal(["2", "0", "1", ["0", "1"], ["0", "1"], "0", "1", "0", "0"], foo.value)
|
103
103
|
|
104
104
|
|
105
|
-
lexer7 =
|
106
|
-
assert foo = lexer7.pop(
|
105
|
+
lexer7 = NexusParser::Lexer.new("read nothing till Nexus, not that nexus 13243 Block [] ();, this one: #nexus FOO")
|
106
|
+
assert foo = lexer7.pop(NexusParser::Tokens::NexusStart)
|
107
107
|
assert_equal('#nexus', foo.value)
|
108
108
|
|
109
109
|
|
110
110
|
## we strip comments before parsing now
|
111
|
-
# lexer8 =
|
112
|
-
# assert foo = lexer8.pop(
|
111
|
+
# lexer8 = NexusParser::Lexer.new("[ foo ] Begin Characters; BLORF end; [] () some crud here")
|
112
|
+
# assert foo = lexer8.pop(NexusParser::Tokens::NexusComment)
|
113
113
|
# assert_equal "foo", foo.value
|
114
114
|
|
115
|
-
# assert lexer.pop(
|
116
|
-
# assert num = lexer.pop(
|
115
|
+
# assert lexer.pop(NexusParser::Tokens::Colon)
|
116
|
+
# assert num = lexer.pop(NexusParser::Tokens::Number)
|
117
117
|
# assert_equal(num.value, 0.0)
|
118
|
-
# assert lexer.pop(
|
119
|
-
# assert lexer.pop(
|
118
|
+
# assert lexer.pop(NexusParser::Tokens::Comma)
|
119
|
+
# assert lexer.pop(NexusParser::Tokens::SemiColon)
|
120
120
|
end
|
121
121
|
|
122
122
|
def test_row_vec
|
123
|
-
lexer =
|
124
|
-
assert foo = lexer.pop(
|
123
|
+
lexer = NexusParser::Lexer.new("0?(0 1)10(A BD , C)1(0,1,2)1-\n")
|
124
|
+
assert foo = lexer.pop(NexusParser::Tokens::RowVec)
|
125
125
|
assert_equal(["0", "?", ["0", "1"], "1", "0", ["A", "BD", "C"], "1", ["0", "1", "2"], "1", "-"], foo.value)
|
126
126
|
end
|
127
127
|
|
128
128
|
def test_punctuation
|
129
|
-
lexer =
|
130
|
-
assert lexer.peek(
|
131
|
-
assert lexer.pop(
|
132
|
-
assert lexer.pop(
|
133
|
-
assert lexer.pop(
|
134
|
-
assert lexer.pop(
|
135
|
-
assert lexer.pop(
|
136
|
-
assert foo = lexer.pop(
|
129
|
+
lexer = NexusParser::Lexer.new(',/=](\'NOT23\'[);,')
|
130
|
+
assert lexer.peek(NexusParser::Tokens::Comma)
|
131
|
+
assert lexer.pop(NexusParser::Tokens::Comma)
|
132
|
+
assert lexer.pop(NexusParser::Tokens::BckSlash)
|
133
|
+
assert lexer.pop(NexusParser::Tokens::Equals)
|
134
|
+
assert lexer.pop(NexusParser::Tokens::RBracket)
|
135
|
+
assert lexer.pop(NexusParser::Tokens::LParen)
|
136
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
137
137
|
assert_equal "NOT23", foo.value
|
138
|
-
assert lexer.pop(
|
139
|
-
assert lexer.pop(
|
140
|
-
assert lexer.pop(
|
141
|
-
assert lexer.pop(
|
138
|
+
assert lexer.pop(NexusParser::Tokens::LBracket)
|
139
|
+
assert lexer.pop(NexusParser::Tokens::RParen)
|
140
|
+
assert lexer.pop(NexusParser::Tokens::SemiColon)
|
141
|
+
assert lexer.pop(NexusParser::Tokens::Comma)
|
142
142
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def test_tax_labels
|
146
|
-
lexer =
|
147
|
-
assert foo = lexer.pop(
|
146
|
+
lexer = NexusParser::Lexer.new("Taxlabels 'foo' bar blorf \"stuff things\" stuff 'and foo';")
|
147
|
+
assert foo = lexer.pop(NexusParser::Tokens::Taxlabels)
|
148
148
|
assert_equal("Taxlabels ", foo.value)
|
149
149
|
end
|
150
150
|
|
151
151
|
def test_EndBlk
|
152
|
-
lexer =
|
153
|
-
assert foo = lexer.pop(
|
154
|
-
lexer =
|
155
|
-
assert foo = lexer.pop(
|
152
|
+
lexer = NexusParser::Lexer.new(" \n\n End ;")
|
153
|
+
assert foo = lexer.pop(NexusParser::Tokens::EndBlk)
|
154
|
+
lexer = NexusParser::Lexer.new("\n\nEnd;")
|
155
|
+
assert foo = lexer.pop(NexusParser::Tokens::EndBlk)
|
156
156
|
|
157
|
-
lexer =
|
158
|
-
assert !lexer.peek(
|
159
|
-
lexer =
|
160
|
-
assert !lexer.peek(
|
157
|
+
lexer = NexusParser::Lexer.new("123123 \n\nEnd;")
|
158
|
+
assert !lexer.peek(NexusParser::Tokens::EndBlk)
|
159
|
+
lexer = NexusParser::Lexer.new("this is not an \"end\"\n\nEnd;")
|
160
|
+
assert !lexer.peek(NexusParser::Tokens::EndBlk)
|
161
161
|
end
|
162
162
|
|
163
163
|
def test_semicolon
|
164
|
-
lexer =
|
165
|
-
assert lexer.peek(
|
166
|
-
assert foo = lexer.pop(
|
164
|
+
lexer = NexusParser::Lexer.new("; Matrix foo")
|
165
|
+
assert lexer.peek(NexusParser::Tokens::SemiColon)
|
166
|
+
assert foo = lexer.pop(NexusParser::Tokens::SemiColon)
|
167
167
|
end
|
168
168
|
|
169
169
|
def test_label
|
170
|
-
lexer =
|
171
|
-
assert foo = lexer.pop(
|
170
|
+
lexer = NexusParser::Lexer.new(' \'foo\' bar, blorf; "stuff things" stuff \'and foo\' 23434 ""asdf"" \'Foo_And_Stuff\' ')
|
171
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
172
172
|
assert_equal "foo", foo.value
|
173
|
-
assert foo = lexer.pop(
|
173
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
174
174
|
assert_equal "bar", foo.value
|
175
|
-
assert lexer.pop(
|
176
|
-
assert foo = lexer.pop(
|
175
|
+
assert lexer.pop(NexusParser::Tokens::Comma)
|
176
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
177
177
|
assert_equal "blorf", foo.value
|
178
|
-
assert lexer.pop(
|
179
|
-
assert foo = lexer.pop(
|
178
|
+
assert lexer.pop(NexusParser::Tokens::SemiColon)
|
179
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
180
180
|
assert_equal "stuff things", foo.value
|
181
|
-
assert foo = lexer.pop(
|
181
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
182
182
|
assert_equal "stuff", foo.value
|
183
|
-
assert foo = lexer.pop(
|
183
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
184
184
|
assert_equal "and foo", foo.value
|
185
|
-
assert foo = lexer.pop(
|
185
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
186
186
|
assert_equal "23434", foo.value
|
187
|
-
assert foo = lexer.pop(
|
187
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
188
188
|
assert_equal '"asdf"', foo.value
|
189
|
-
assert foo = lexer.pop(
|
189
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
190
190
|
assert_equal 'Foo_And_Stuff', foo.value
|
191
191
|
end
|
192
192
|
|
193
193
|
def test_odd_labels
|
194
|
-
lexer =
|
195
|
-
assert foo = lexer.pop(
|
194
|
+
lexer = NexusParser::Lexer.new("blorf 'fan shaped, narrow base and broad tip (Selkirkiella, Kochiura)' \"\"\" foo \"\"\" '''rupununi''' '''tanzania''' '''cup-shaped''' bar blorf\n;")
|
195
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
196
196
|
assert_equal "blorf", foo.value
|
197
|
-
assert foo = lexer.pop(
|
197
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
198
198
|
assert_equal "fan shaped, narrow base and broad tip (Selkirkiella, Kochiura)", foo.value
|
199
|
-
assert foo = lexer.pop(
|
199
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
200
200
|
assert_equal '"" foo ""', foo.value
|
201
|
-
assert foo = lexer.pop(
|
201
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
202
202
|
assert_equal "''rupununi''", foo.value
|
203
|
-
assert foo = lexer.pop(
|
203
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
204
204
|
assert_equal "''tanzania''", foo.value
|
205
|
-
assert foo = lexer.pop(
|
205
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
206
206
|
assert_equal "''cup-shaped''", foo.value
|
207
|
-
assert foo = lexer.pop(
|
207
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
208
208
|
assert_equal "bar", foo.value
|
209
|
-
assert foo = lexer.pop(
|
209
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
210
210
|
assert_equal "blorf", foo.value
|
211
|
-
assert foo = lexer.pop(
|
211
|
+
assert foo = lexer.pop(NexusParser::Tokens::SemiColon)
|
212
212
|
end
|
213
213
|
|
214
214
|
def test_title
|
215
|
-
lexer =
|
216
|
-
assert foo = lexer.pop(
|
215
|
+
lexer = NexusParser::Lexer.new( "TITLE 'Scharff&Coddington_1997_Araneidae';")
|
216
|
+
assert foo = lexer.pop(NexusParser::Tokens::Title)
|
217
217
|
assert_equal "TITLE 'Scharff&Coddington_1997_Araneidae';", foo.value
|
218
218
|
end
|
219
219
|
|
220
220
|
|
221
221
|
def test_dimensions
|
222
222
|
input = " DIMENSIONS NCHAR= 10"
|
223
|
-
lexer =
|
224
|
-
assert foo = lexer.pop(
|
223
|
+
lexer = NexusParser::Lexer.new(input)
|
224
|
+
assert foo = lexer.pop(NexusParser::Tokens::Dimensions)
|
225
225
|
assert_equal "DIMENSIONS", foo.value
|
226
226
|
end
|
227
227
|
|
228
228
|
def test_format
|
229
229
|
input = " format NCHAR= 10"
|
230
|
-
lexer =
|
231
|
-
assert foo = lexer.pop(
|
230
|
+
lexer = NexusParser::Lexer.new(input)
|
231
|
+
assert foo = lexer.pop(NexusParser::Tokens::Format)
|
232
232
|
assert_equal "format", foo.value
|
233
233
|
end
|
234
234
|
|
235
235
|
def test_odd_value_pair
|
236
|
-
lexer =
|
236
|
+
lexer = NexusParser::Lexer.new(" TEXT CHARACTER = 3 TEXT = A62.003;
|
237
237
|
|
238
238
|
TEXT CHARACTER = 4 TEXT = A62.004; \n end; ")
|
239
|
-
assert foo = lexer.pop(
|
240
|
-
assert foo = lexer.pop(
|
239
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
240
|
+
assert foo = lexer.pop(NexusParser::Tokens::ValuePair)
|
241
241
|
blorf = {:character => "3"}
|
242
242
|
assert_equal blorf , foo.value
|
243
|
-
assert foo = lexer.pop(
|
243
|
+
assert foo = lexer.pop(NexusParser::Tokens::ValuePair)
|
244
244
|
blorf = {:text => "A62.003"}
|
245
245
|
assert_equal blorf , foo.value
|
246
|
-
assert foo = lexer.pop(
|
246
|
+
assert foo = lexer.pop(NexusParser::Tokens::Label)
|
247
247
|
assert_equal "TEXT", foo.value
|
248
|
-
assert foo = lexer.pop(
|
248
|
+
assert foo = lexer.pop(NexusParser::Tokens::ValuePair)
|
249
249
|
blorf = {:character => "4"}
|
250
250
|
assert_equal blorf , foo.value
|
251
|
-
assert foo = lexer.pop(
|
251
|
+
assert foo = lexer.pop(NexusParser::Tokens::ValuePair)
|
252
252
|
blorf = {:text => "A62.004"}
|
253
253
|
assert_equal blorf , foo.value
|
254
254
|
|
@@ -257,92 +257,92 @@ class Test_Lexer < Test::Unit::TestCase
|
|
257
257
|
|
258
258
|
def test_value_pair
|
259
259
|
|
260
|
-
lexer0 =
|
261
|
-
assert foo = lexer0.pop(
|
260
|
+
lexer0 = NexusParser::Lexer.new(' DATATYPE=STANDARD ')
|
261
|
+
assert foo = lexer0.pop(NexusParser::Tokens::ValuePair)
|
262
262
|
blorf = {:datatype => "STANDARD"}
|
263
263
|
assert_equal blorf , foo.value
|
264
264
|
|
265
|
-
lexer =
|
266
|
-
assert foo = lexer.pop(
|
265
|
+
lexer = NexusParser::Lexer.new(' DATATYPE = STANDARD ')
|
266
|
+
assert foo = lexer.pop(NexusParser::Tokens::ValuePair)
|
267
267
|
blorf = {:datatype => "STANDARD"}
|
268
268
|
assert_equal blorf , foo.value
|
269
269
|
|
270
|
-
lexer2 =
|
271
|
-
assert foo = lexer2.pop(
|
270
|
+
lexer2 = NexusParser::Lexer.new(' DATATYPE ="STANDARD" ')
|
271
|
+
assert foo = lexer2.pop(NexusParser::Tokens::ValuePair)
|
272
272
|
assert_equal blorf, foo.value
|
273
273
|
|
274
|
-
lexer3 =
|
275
|
-
assert foo = lexer3.pop(
|
274
|
+
lexer3 = NexusParser::Lexer.new('DATATYPE= "STANDARD" ')
|
275
|
+
assert foo = lexer3.pop(NexusParser::Tokens::ValuePair)
|
276
276
|
assert_equal blorf, foo.value
|
277
277
|
|
278
278
|
input= " NCHAR=10 ntaxa =10 nfoo='999' nbar = \" a b c \" ; "
|
279
|
-
lexer4 =
|
280
|
-
assert foo = lexer4.pop(
|
279
|
+
lexer4 = NexusParser::Lexer.new(input)
|
280
|
+
assert foo = lexer4.pop(NexusParser::Tokens::ValuePair)
|
281
281
|
smorf = {:nchar => '10'}
|
282
282
|
assert_equal smorf, foo.value
|
283
|
-
assert foo = lexer4.pop(
|
283
|
+
assert foo = lexer4.pop(NexusParser::Tokens::ValuePair)
|
284
284
|
smorf = {:ntaxa => '10'}
|
285
285
|
assert_equal smorf, foo.value
|
286
|
-
assert foo = lexer4.pop(
|
286
|
+
assert foo = lexer4.pop(NexusParser::Tokens::ValuePair)
|
287
287
|
smorf = {:nfoo => '999'}
|
288
288
|
assert_equal smorf, foo.value
|
289
|
-
assert foo = lexer4.pop(
|
289
|
+
assert foo = lexer4.pop(NexusParser::Tokens::ValuePair)
|
290
290
|
smorf = {:nbar => 'a b c'}
|
291
291
|
assert_equal smorf, foo.value
|
292
292
|
|
293
|
-
lexer5 =
|
294
|
-
assert foo = lexer5.pop(
|
293
|
+
lexer5 = NexusParser::Lexer.new(' symbols= " a c b d 1 " ')
|
294
|
+
assert foo = lexer5.pop(NexusParser::Tokens::ValuePair)
|
295
295
|
smorf = {:symbols => 'a c b d 1'}
|
296
296
|
assert_equal smorf, foo.value
|
297
297
|
|
298
|
-
lexer6 =
|
299
|
-
assert foo = lexer6.pop(
|
298
|
+
lexer6 = NexusParser::Lexer.new(' missing = - ')
|
299
|
+
assert foo = lexer6.pop(NexusParser::Tokens::ValuePair)
|
300
300
|
smorf = {:missing => '-'}
|
301
301
|
assert_equal smorf, foo.value
|
302
302
|
|
303
|
-
lexer6a =
|
304
|
-
assert foo = lexer6a.pop(
|
303
|
+
lexer6a = NexusParser::Lexer.new("ntaxa=1;\n")
|
304
|
+
assert foo = lexer6a.pop(NexusParser::Tokens::ValuePair)
|
305
305
|
smorf = {:ntaxa => '1'}
|
306
306
|
assert_equal smorf, foo.value
|
307
307
|
|
308
|
-
lexer7 =
|
309
|
-
assert foo = lexer7.pop(
|
308
|
+
lexer7 = NexusParser::Lexer.new("ntaxa =1;\n")
|
309
|
+
assert foo = lexer7.pop(NexusParser::Tokens::ValuePair)
|
310
310
|
smorf = {:ntaxa => '1'}
|
311
311
|
assert_equal smorf, foo.value
|
312
312
|
|
313
|
-
lexer8 =
|
314
|
-
assert foo = lexer8.pop(
|
313
|
+
lexer8 = NexusParser::Lexer.new(" ntaxa = 1 ;\n")
|
314
|
+
assert foo = lexer8.pop(NexusParser::Tokens::ValuePair)
|
315
315
|
smorf = {:ntaxa => '1'}
|
316
316
|
assert_equal smorf, foo.value
|
317
317
|
|
318
|
-
lexer9 =
|
319
|
-
assert foo = lexer9.pop(
|
318
|
+
lexer9 = NexusParser::Lexer.new(" TF = (CM 'This is an annotation that haa a hard return in it^n^n^n^nSo there!') ")
|
319
|
+
assert foo = lexer9.pop(NexusParser::Tokens::ValuePair)
|
320
320
|
smorf = {:tf => "(CM 'This is an annotation that haa a hard return in it^n^n^n^nSo there!')" }
|
321
321
|
assert_equal smorf, foo.value
|
322
322
|
|
323
|
-
lexer10 =
|
324
|
-
assert foo = lexer10.pop(
|
323
|
+
lexer10 = NexusParser::Lexer.new(" TF = (CM 'This is an value pair that has (parens) within the value, twice! ()') ; some stuff left here ")
|
324
|
+
assert foo = lexer10.pop(NexusParser::Tokens::ValuePair)
|
325
325
|
smorf = {:tf => "(CM 'This is an value pair that has (parens) within the value, twice! ()')" }
|
326
326
|
assert_equal smorf, foo.value
|
327
327
|
|
328
|
-
lexer11 =
|
329
|
-
assert_equal true, !lexer11.peek(
|
330
|
-
assert_equal true, lexer11.peek(
|
331
|
-
assert foo = lexer11.pop(
|
328
|
+
lexer11 = NexusParser::Lexer.new("CHARACTER = 1 TEXT = A62.001;")
|
329
|
+
assert_equal true, !lexer11.peek(NexusParser::Tokens::SemiColon)
|
330
|
+
assert_equal true, lexer11.peek(NexusParser::Tokens::ValuePair)
|
331
|
+
assert foo = lexer11.pop(NexusParser::Tokens::ValuePair)
|
332
332
|
smorf = {:character => "1" }
|
333
333
|
assert_equal smorf, foo.value
|
334
|
-
assert foo = lexer11.pop(
|
334
|
+
assert foo = lexer11.pop(NexusParser::Tokens::ValuePair)
|
335
335
|
end
|
336
336
|
|
337
337
|
def test_MesquiteIDs
|
338
|
-
lexer =
|
338
|
+
lexer = NexusParser::Lexer.new('IDS JC1191fcddc3b425 JC1191fcddc3b426 JC1191fcddc3b427 JC1191fcddc3b428 JC1191fcddc3b429 JC1191fcddc3b430 JC1191fcddc3b431 JC1191fcddc3b432 JC1191fcddc3b433 JC1191fcddc3b434 ;
|
339
339
|
BLOCKID JC1191fcddc0c0;')
|
340
|
-
assert lexer.pop(
|
341
|
-
assert lexer.pop(
|
340
|
+
assert lexer.pop(NexusParser::Tokens::MesquiteIDs)
|
341
|
+
assert lexer.pop(NexusParser::Tokens::MesquiteBlockID)
|
342
342
|
end
|
343
343
|
|
344
344
|
def test_TreesBlk
|
345
|
-
lexer =
|
345
|
+
lexer = NexusParser::Lexer.new("BEGIN TREES;
|
346
346
|
Title Imported_trees;
|
347
347
|
LINK Taxa = 'Scharff&Coddington_1997_Araneidae';
|
348
348
|
TRANSLATE
|
@@ -377,25 +377,25 @@ class Test_Lexer < Test::Unit::TestCase
|
|
377
377
|
|
378
378
|
END;")
|
379
379
|
|
380
|
-
assert lexer.pop(
|
381
|
-
assert foo = lexer.pop(
|
380
|
+
assert lexer.pop(NexusParser::Tokens::BeginBlk)
|
381
|
+
assert foo = lexer.pop(NexusParser::Tokens::TreesBlk)
|
382
382
|
assert_equal 'TREES', foo.value.slice(0,5)
|
383
383
|
assert_equal 'END;', foo.value.slice(-4,4)
|
384
|
-
assert lexer.pop(
|
385
|
-
assert lexer.pop(
|
384
|
+
assert lexer.pop(NexusParser::Tokens::BeginBlk)
|
385
|
+
assert lexer.pop(NexusParser::Tokens::LabelsBlk)
|
386
386
|
|
387
387
|
end
|
388
388
|
|
389
389
|
def test_NotesBlk
|
390
390
|
input = "BEGIN NOTES ;"
|
391
|
-
lexer =
|
392
|
-
assert lexer.pop(
|
393
|
-
assert foo = lexer.pop(
|
391
|
+
lexer = NexusParser::Lexer.new(input)
|
392
|
+
assert lexer.pop(NexusParser::Tokens::BeginBlk)
|
393
|
+
assert foo = lexer.pop(NexusParser::Tokens::NotesBlk)
|
394
394
|
assert "NOTES", foo.value
|
395
395
|
end
|
396
396
|
|
397
397
|
def test_LabelsBlk
|
398
|
-
lexer =
|
398
|
+
lexer = NexusParser::Lexer.new("
|
399
399
|
LABELS;
|
400
400
|
CHARGROUPLABEL MM_Genitalia COLOR = (RGB 1.0 0.4 0.4) ;
|
401
401
|
CHARGROUPLABEL Somatic COLOR = (RGB 0.6 1.0 0.33333333) ;
|
@@ -407,29 +407,27 @@ class Test_Lexer < Test::Unit::TestCase
|
|
407
407
|
|
408
408
|
BEGIN some other block;")
|
409
409
|
|
410
|
-
assert foo = lexer.pop(
|
410
|
+
assert foo = lexer.pop(NexusParser::Tokens::LabelsBlk)
|
411
411
|
assert_equal 'LABELS', foo.value.slice(0,6)
|
412
412
|
assert_equal 'END;', foo.value.slice(-4,4)
|
413
413
|
end
|
414
414
|
|
415
415
|
def test_SetsBlk
|
416
|
-
lexer =
|
416
|
+
lexer = NexusParser::Lexer.new("
|
417
417
|
SETS;
|
418
418
|
CHARPARTITION * UNTITLED = Somatic : 1 - 2 4, MM_Genitalia : 5 - 8 10;
|
419
419
|
|
420
420
|
END;
|
421
421
|
BEGIN some other block;")
|
422
422
|
|
423
|
-
assert foo = lexer.pop(
|
423
|
+
assert foo = lexer.pop(NexusParser::Tokens::SetsBlk)
|
424
424
|
assert_equal 'SETS', foo.value.slice(0,4)
|
425
425
|
assert_equal 'END;', foo.value.slice(-4,4)
|
426
426
|
end
|
427
427
|
|
428
|
-
|
429
|
-
|
430
428
|
def test_lexer_errors
|
431
|
-
lexer =
|
432
|
-
assert_raise(
|
429
|
+
lexer = NexusParser::Lexer.new("*&")
|
430
|
+
assert_raise(NexusParser::ParseError) {lexer.peek(NexusParser::Tokens::ID)}
|
433
431
|
end
|
434
432
|
end
|
435
433
|
|
@@ -437,7 +435,7 @@ end
|
|
437
435
|
class Test_Parser < Test::Unit::TestCase
|
438
436
|
def setup
|
439
437
|
# a Mesquite 2.n or higher file
|
440
|
-
@nf = File.read('MX_test_03.nex')
|
438
|
+
@nf = File.read(File.expand_path(File.join(File.dirname(__FILE__), '../test/MX_test_03.nex')))
|
441
439
|
end
|
442
440
|
|
443
441
|
def teardown
|
@@ -447,7 +445,7 @@ class Test_Parser < Test::Unit::TestCase
|
|
447
445
|
def test_that_file_might_be_nexus
|
448
446
|
begin
|
449
447
|
assert !parse_nexus_file("#Nexblux Begin Natrix end;")
|
450
|
-
rescue
|
448
|
+
rescue NexusParser::ParseError
|
451
449
|
assert true
|
452
450
|
end
|
453
451
|
end
|
@@ -483,9 +481,9 @@ class Test_Parser < Test::Unit::TestCase
|
|
483
481
|
BLOCKID JC1191fcddc0c4;
|
484
482
|
END;"
|
485
483
|
|
486
|
-
builder =
|
487
|
-
lexer =
|
488
|
-
|
484
|
+
builder = NexusParser::Builder.new
|
485
|
+
lexer = NexusParser::Lexer.new(input)
|
486
|
+
NexusParser::Parser.new(lexer,builder).parse_taxa_blk
|
489
487
|
foo = builder.nexus_file
|
490
488
|
|
491
489
|
assert_equal 10, foo.taxa.size
|
@@ -505,9 +503,9 @@ class Test_Parser < Test::Unit::TestCase
|
|
505
503
|
;
|
506
504
|
END;"
|
507
505
|
|
508
|
-
builder =
|
509
|
-
lexer =
|
510
|
-
|
506
|
+
builder = NexusParser::Builder.new
|
507
|
+
lexer = NexusParser::Lexer.new(input)
|
508
|
+
NexusParser::Parser.new(lexer,builder).parse_taxa_blk
|
511
509
|
foo = builder.nexus_file
|
512
510
|
|
513
511
|
assert_equal 10, foo.taxa.size
|
@@ -544,8 +542,8 @@ class Test_Parser < Test::Unit::TestCase
|
|
544
542
|
|
545
543
|
END;"
|
546
544
|
|
547
|
-
builder =
|
548
|
-
@lexer =
|
545
|
+
builder = NexusParser::Builder.new
|
546
|
+
@lexer = NexusParser::Lexer.new(input)
|
549
547
|
|
550
548
|
# add the taxa, assumes we have them for comparison purposes, though we (shouldn't) ultimately need them
|
551
549
|
# foo.taxa = ["Dictyna", "Uloborus", "Deinopis", "Nephila&Herennia", "Nephilenygys_cruentata", "Meta", "Leucauge_venusta", "Pachygnatha", "Theridiosoma_01", "Tetragnatha"]
|
@@ -553,7 +551,7 @@ class Test_Parser < Test::Unit::TestCase
|
|
553
551
|
# stub the taxa, they would otherwise get added in dimensions or taxa block
|
554
552
|
(0..9).each{|i| builder.stub_taxon}
|
555
553
|
|
556
|
-
|
554
|
+
NexusParser::Parser.new(@lexer,builder).parse_characters_blk
|
557
555
|
foo = builder.nexus_file
|
558
556
|
|
559
557
|
assert_equal 10, foo.characters.size
|
@@ -595,8 +593,8 @@ class Test_Parser < Test::Unit::TestCase
|
|
595
593
|
;
|
596
594
|
END;"
|
597
595
|
|
598
|
-
builder =
|
599
|
-
@lexer =
|
596
|
+
builder = NexusParser::Builder.new
|
597
|
+
@lexer = NexusParser::Lexer.new(input)
|
600
598
|
|
601
599
|
# add the taxa, assumes we have them for comparison purposes, though we (shouldn't) ultimately need them
|
602
600
|
# foo.taxa = ["Dictyna", "Uloborus", "Deinopis", "Nephila&Herennia", "Nephilenygys_cruentata", "Meta", "Leucauge_venusta", "Pachygnatha", "Theridiosoma_01", "Tetragnatha"]
|
@@ -604,7 +602,7 @@ class Test_Parser < Test::Unit::TestCase
|
|
604
602
|
# stub the taxa, they would otherwise get added in dimensions or taxa block
|
605
603
|
(0..9).each{|i| builder.stub_taxon}
|
606
604
|
|
607
|
-
|
605
|
+
NexusParser::Parser.new(@lexer,builder).parse_characters_blk
|
608
606
|
foo = builder.nexus_file
|
609
607
|
|
610
608
|
assert_equal 10, foo.characters.size
|
@@ -630,10 +628,10 @@ class Test_Parser < Test::Unit::TestCase
|
|
630
628
|
|
631
629
|
def test_parse_dimensions
|
632
630
|
input= " DIMENSIONS NCHAR=10 ntaxa =10 nfoo='999' nbar = \" a b c \" blorf=2; "
|
633
|
-
builder =
|
634
|
-
lexer =
|
631
|
+
builder = NexusParser::Builder.new
|
632
|
+
lexer = NexusParser::Lexer.new(input)
|
635
633
|
|
636
|
-
|
634
|
+
NexusParser::Parser.new(lexer,builder).parse_dimensions
|
637
635
|
foo = builder.nexus_file
|
638
636
|
|
639
637
|
assert_equal "10", foo.vars[:nchar]
|
@@ -646,10 +644,10 @@ class Test_Parser < Test::Unit::TestCase
|
|
646
644
|
|
647
645
|
def test_parse_format
|
648
646
|
input = "FORMAT DATATYPE = STANDARD GAP = - MISSING = ? SYMBOLS = \" 0 1 2 3 4 5 6 7 8 9 A\";"
|
649
|
-
builder =
|
650
|
-
lexer =
|
647
|
+
builder = NexusParser::Builder.new
|
648
|
+
lexer = NexusParser::Lexer.new(input)
|
651
649
|
|
652
|
-
|
650
|
+
NexusParser::Parser.new(lexer,builder).parse_format
|
653
651
|
foo = builder.nexus_file
|
654
652
|
|
655
653
|
assert_equal "STANDARD", foo.vars[:datatype]
|
@@ -665,12 +663,12 @@ class Test_Parser < Test::Unit::TestCase
|
|
665
663
|
MATRIX
|
666
664
|
fooo 01 more stuff here that should not be hit"
|
667
665
|
|
668
|
-
builder =
|
669
|
-
lexer =
|
666
|
+
builder = NexusParser::Builder.new
|
667
|
+
lexer = NexusParser::Lexer.new(input)
|
670
668
|
|
671
669
|
(0..9).each{builder.stub_chr()}
|
672
670
|
|
673
|
-
|
671
|
+
NexusParser::Parser.new(lexer,builder).parse_chr_state_labels
|
674
672
|
|
675
673
|
foo = builder.nexus_file
|
676
674
|
assert_equal 10, foo.characters.size
|
@@ -720,12 +718,12 @@ class Test_Parser < Test::Unit::TestCase
|
|
720
718
|
Matrix
|
721
719
|
fooo 01 more stuff here that should not be hit"
|
722
720
|
|
723
|
-
builder =
|
724
|
-
lexer =
|
721
|
+
builder = NexusParser::Builder.new
|
722
|
+
lexer = NexusParser::Lexer.new(input)
|
725
723
|
|
726
724
|
(0..29).each{builder.stub_chr()}
|
727
725
|
|
728
|
-
|
726
|
+
NexusParser::Parser.new(lexer,builder).parse_chr_state_labels
|
729
727
|
|
730
728
|
foo = builder.nexus_file
|
731
729
|
|
@@ -746,12 +744,12 @@ class Test_Parser < Test::Unit::TestCase
|
|
746
744
|
MATRIX
|
747
745
|
fooo 01 more stuff here that should not be hit"
|
748
746
|
|
749
|
-
builder =
|
750
|
-
lexer =
|
747
|
+
builder = NexusParser::Builder.new
|
748
|
+
lexer = NexusParser::Lexer.new(input)
|
751
749
|
|
752
750
|
(0..147).each{builder.stub_chr()}
|
753
751
|
|
754
|
-
|
752
|
+
NexusParser::Parser.new(lexer,builder).parse_chr_state_labels
|
755
753
|
|
756
754
|
foo = builder.nexus_file
|
757
755
|
assert_equal 10, foo.characters.size
|
@@ -823,24 +821,24 @@ class Test_Parser < Test::Unit::TestCase
|
|
823
821
|
|
824
822
|
# note the second last note note embedds parens in the value
|
825
823
|
|
826
|
-
builder =
|
827
|
-
lexer =
|
824
|
+
builder = NexusParser::Builder.new
|
825
|
+
lexer = NexusParser::Lexer.new(input)
|
828
826
|
|
829
827
|
# stubs
|
830
828
|
(0..9).each{builder.stub_chr()}
|
831
829
|
(0..9).each{builder.stub_taxon()}
|
832
830
|
builder.nexus_file.codings[3] = []
|
833
|
-
builder.nexus_file.codings[3][7] =
|
831
|
+
builder.nexus_file.codings[3][7] = NexusParser::NexusParser::Coding.new()
|
834
832
|
builder.nexus_file.codings[8] = []
|
835
|
-
builder.nexus_file.codings[8][2] =
|
833
|
+
builder.nexus_file.codings[8][2] = NexusParser::NexusParser::Coding.new()
|
836
834
|
builder.nexus_file.codings[1] = []
|
837
|
-
builder.nexus_file.codings[1][5] =
|
835
|
+
builder.nexus_file.codings[1][5] = NexusParser::NexusParser::Coding.new()
|
838
836
|
builder.nexus_file.codings[6] = []
|
839
|
-
builder.nexus_file.codings[6][9] =
|
837
|
+
builder.nexus_file.codings[6][9] = NexusParser::NexusParser::Coding.new()
|
840
838
|
builder.nexus_file.codings[3] = []
|
841
|
-
builder.nexus_file.codings[3][7] =
|
839
|
+
builder.nexus_file.codings[3][7] = NexusParser::NexusParser::Coding.new()
|
842
840
|
|
843
|
-
|
841
|
+
NexusParser::Parser.new(lexer,builder).parse_notes_blk
|
844
842
|
|
845
843
|
foo = builder.nexus_file
|
846
844
|
|
@@ -890,12 +888,12 @@ class Test_Parser < Test::Unit::TestCase
|
|
890
888
|
|
891
889
|
# note the second last note note embeds parens in the value
|
892
890
|
|
893
|
-
builder =
|
894
|
-
lexer =
|
891
|
+
builder = NexusParser::Builder.new
|
892
|
+
lexer = NexusParser::Lexer.new(input)
|
895
893
|
# stubs
|
896
894
|
(0..9).each{builder.stub_chr()}
|
897
895
|
|
898
|
-
|
896
|
+
NexusParser::Parser.new(lexer,builder).parse_notes_blk
|
899
897
|
|
900
898
|
foo = builder.nexus_file
|
901
899
|
|
@@ -910,11 +908,10 @@ class Test_Parser < Test::Unit::TestCase
|
|
910
908
|
assert_equal 'A62.006', foo.characters[5].notes[0].note
|
911
909
|
assert_equal 'A62.007', foo.characters[6].notes[0].note
|
912
910
|
assert_equal 'A62.008', foo.characters[7].notes[0].note
|
913
|
-
assert_equal
|
911
|
+
assert_equal NexusParser::NexusParser::Character, foo.characters[7].class
|
914
912
|
assert_equal 1, foo.characters[7].notes.size
|
915
913
|
end
|
916
914
|
|
917
|
-
|
918
915
|
def test_parse_trees_block
|
919
916
|
end
|
920
917
|
|