nexus_parser 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|