taxonifi 0.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.
Files changed (53) hide show
  1. data/.document +5 -0
  2. data/Gemfile +18 -0
  3. data/Gemfile.lock +30 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +155 -0
  6. data/Rakefile +53 -0
  7. data/VERSION +1 -0
  8. data/lib/assessor/assessor.rb +31 -0
  9. data/lib/assessor/base.rb +17 -0
  10. data/lib/assessor/row_assessor.rb +131 -0
  11. data/lib/export/export.rb +9 -0
  12. data/lib/export/format/base.rb +43 -0
  13. data/lib/export/format/species_file.rb +341 -0
  14. data/lib/lumper/lumper.rb +334 -0
  15. data/lib/lumper/lumps/parent_child_name_collection.rb +84 -0
  16. data/lib/models/author_year.rb +39 -0
  17. data/lib/models/base.rb +73 -0
  18. data/lib/models/collection.rb +92 -0
  19. data/lib/models/generic_object.rb +15 -0
  20. data/lib/models/geog.rb +59 -0
  21. data/lib/models/geog_collection.rb +28 -0
  22. data/lib/models/name.rb +206 -0
  23. data/lib/models/name_collection.rb +149 -0
  24. data/lib/models/person.rb +49 -0
  25. data/lib/models/ref.rb +85 -0
  26. data/lib/models/ref_collection.rb +106 -0
  27. data/lib/models/species_name.rb +85 -0
  28. data/lib/splitter/builder.rb +26 -0
  29. data/lib/splitter/lexer.rb +70 -0
  30. data/lib/splitter/parser.rb +54 -0
  31. data/lib/splitter/splitter.rb +45 -0
  32. data/lib/splitter/tokens.rb +322 -0
  33. data/lib/taxonifi.rb +36 -0
  34. data/test/file_fixtures/Lygaeoidea.csv +801 -0
  35. data/test/helper.rb +38 -0
  36. data/test/test_exporter.rb +32 -0
  37. data/test/test_lumper_geogs.rb +59 -0
  38. data/test/test_lumper_hierarchical_collection.rb +88 -0
  39. data/test/test_lumper_names.rb +119 -0
  40. data/test/test_lumper_parent_child_name_collection.rb +41 -0
  41. data/test/test_lumper_refs.rb +91 -0
  42. data/test/test_parser.rb +34 -0
  43. data/test/test_splitter.rb +27 -0
  44. data/test/test_splitter_tokens.rb +403 -0
  45. data/test/test_taxonifi.rb +11 -0
  46. data/test/test_taxonifi_accessor.rb +61 -0
  47. data/test/test_taxonifi_geog.rb +51 -0
  48. data/test/test_taxonifi_name.rb +186 -0
  49. data/test/test_taxonifi_name_collection.rb +158 -0
  50. data/test/test_taxonifi_ref.rb +90 -0
  51. data/test/test_taxonifi_ref_collection.rb +69 -0
  52. data/test/test_taxonifi_species_name.rb +95 -0
  53. metadata +167 -0
@@ -0,0 +1,403 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/splitter/splitter'))
3
+
4
+ class Test_TaxonifiSplitterLexer < Test::Unit::TestCase
5
+
6
+ def test_lexer_raises_when_not_hit
7
+ lexer = Taxonifi::Splitter::Lexer.new("123a")
8
+ assert_raises Taxonifi::Splitter::SplitterError do
9
+ lexer.pop(Taxonifi::Splitter::Tokens::Year)
10
+ end
11
+ end
12
+
13
+ end
14
+
15
+ class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
16
+
17
+ def test_year
18
+ lexer = Taxonifi::Splitter::Lexer.new("1235")
19
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Year)
20
+
21
+ lexer = Taxonifi::Splitter::Lexer.new(" 1235")
22
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Year)
23
+
24
+ lexer = Taxonifi::Splitter::Lexer.new(" 1235 ")
25
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Year)
26
+
27
+ lexer = Taxonifi::Splitter::Lexer.new("1235 ")
28
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Year)
29
+
30
+ lexer = Taxonifi::Splitter::Lexer.new("1235\n ")
31
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Year)
32
+ end
33
+
34
+ def test_left_paren
35
+ lexer = Taxonifi::Splitter::Lexer.new("(")
36
+ assert lexer.pop(Taxonifi::Splitter::Tokens::LeftParen)
37
+
38
+ lexer = Taxonifi::Splitter::Lexer.new(" (")
39
+ assert lexer.pop(Taxonifi::Splitter::Tokens::LeftParen)
40
+
41
+ lexer = Taxonifi::Splitter::Lexer.new(" ( ")
42
+ assert lexer.pop(Taxonifi::Splitter::Tokens::LeftParen)
43
+ end
44
+
45
+ def test_right_paren
46
+ lexer = Taxonifi::Splitter::Lexer.new(")")
47
+ assert lexer.pop(Taxonifi::Splitter::Tokens::RightParen)
48
+
49
+ lexer = Taxonifi::Splitter::Lexer.new(" )")
50
+ assert lexer.pop(Taxonifi::Splitter::Tokens::RightParen)
51
+
52
+ lexer = Taxonifi::Splitter::Lexer.new(" ) ")
53
+ assert lexer.pop(Taxonifi::Splitter::Tokens::RightParen)
54
+ end
55
+
56
+ def test_right_paren
57
+ lexer = Taxonifi::Splitter::Lexer.new(",")
58
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Comma)
59
+ end
60
+
61
+ def test_author_year
62
+ # let's try some combinations
63
+ authors = ["Foo", "Foo ", "Kukalova-Peck", "Grimaldi, Michalski & Schmidt", "Smith and Adams", "Smith, J.H.", "Smith, J.H. and Jones, Y.K.", "Lin."]
64
+ comma = [true, false]
65
+ years = ["", " 1993" ]
66
+ parens = [true, false]
67
+
68
+ authors.each do |a|
69
+ years.each do |y|
70
+ comma.each do |c|
71
+ parens.each do |p|
72
+ s = a.to_s + (comma ? "," : "") + y.to_s
73
+ s = "(#{s})" if p
74
+ lexer = Taxonifi::Splitter::Lexer.new(s)
75
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::AuthorYear)
76
+ assert_equal a.strip, t.authors
77
+ assert_equal (y.size > 0 ? y.strip.to_i : nil), t.year
78
+ assert_equal p, t.parens
79
+ s = nil
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ def test_quadrinomial
87
+ ["Foo"].each do |genus|
88
+ ["(Bar)", nil].each do |subgenus|
89
+ sg = nil
90
+ sg = $1
91
+ ["stuff"].each do |species|
92
+ ["things", nil].each do |subspecies|
93
+ str = [genus, subgenus, species, subspecies].compact.join(" ")
94
+ if subgenus
95
+ sg = subgenus[-(subgenus.size-1)..-2]
96
+ else
97
+ sg = nil
98
+ end
99
+ lexer = Taxonifi::Splitter::Lexer.new(str)
100
+ t = lexer.pop(Taxonifi::Splitter::Tokens::Quadrinomial)
101
+ assert_equal genus, t.genus
102
+ assert_equal sg, t.subgenus
103
+ assert_equal species, t.species
104
+ assert_equal subspecies, t.subspecies
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ lexer = Taxonifi::Splitter::Lexer.new("Foo")
111
+ t = lexer.pop(Taxonifi::Splitter::Tokens::Quadrinomial)
112
+ assert_equal "Foo", t.genus
113
+
114
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff")
115
+ t = lexer.pop(Taxonifi::Splitter::Tokens::Quadrinomial)
116
+ assert_equal "Foo", t.genus
117
+ assert_equal "stuff", t.species
118
+
119
+ lexer = Taxonifi::Splitter::Lexer.new('Foo (Bar) stuff things (Smith, 1912) and some other...')
120
+ t = lexer.pop(Taxonifi::Splitter::Tokens::Quadrinomial)
121
+ assert_equal "Foo", t.genus
122
+ assert_equal "Bar", t.subgenus
123
+ assert_equal "stuff", t.species
124
+ assert_equal "things", t.subspecies
125
+ end
126
+
127
+
128
+ # Token is very flexible.
129
+ def test_authors
130
+ auths = [
131
+ "Jepson, J.E.,Makarkin, V.N., & Jarzembowski, E.A.", # 0
132
+ "Ren, D & Meng, X-m.", # 1
133
+ "Ren, D and Meng, X-m.", # 2
134
+ "Smith, J.H. and Jones, Y.K.", # 3
135
+ "Thomas jr. D.B.", # 4
136
+ "Wighton, D.C., & Wilson, M.V.H.", # 5
137
+ "Heyden, C.H.G. von & Heyden, L.F.J.D. von", # 6
138
+ "Zhang, B., et al.", # 7
139
+ " Zhang, J.F. ", # 8
140
+ "Hong, Y-C.", # 9
141
+ "Yan, E.V.", # 10
142
+ "Foo A, Bar ZA, Smith-Blorf A", # 11
143
+ "Smith and Barnes", # 12
144
+ "Smith & Barnes", # 13
145
+ "Smith", # 14
146
+ "Smith, Jones and Simon", # 15
147
+ "Van Duzee", # 16
148
+ "Walker, F.", # 17
149
+ "Watson, T. F., D. Langston, D. Fullerton, R. Rakickas, B. Engroff, R. Rokey, and L. Bricker", # 18
150
+ "Wheeler, A. G., Jr. and T. J. Henry.", # 19
151
+ "Wheeler, A. G., Jr., B. R. Stinner, and T. J. Henry", # 20
152
+ "Wilson, L. T. and A. P. Gutierrez", # 21
153
+ "Torre-Bueno, J. R. de la", # 22
154
+ "Vollenhoven, S. C. S.", # 23
155
+ "Usinger, R. L. and P. D. Ashlock", # 24
156
+ "van den Bosch, R. and K. Hagen", # 25
157
+ "Slater, J. A. and J. E. O'Donnell", # 26
158
+ "O'Donnell, J.E. and Slater, J. A.", # 27
159
+ "Van Steenwyk, R. A., N. C. Toscano, G. R. Ballmer, K. Kido, and H. T. Reynolds", # 28
160
+ "Ward, C. R., C. W. O'Brien, L. B. O'Brien, D. E. Foster, and E. W. Huddleston", # 29
161
+ "McPherson, R. M., J. C. Smith, and W. A. Allen", # 30
162
+ "Oatman, E. R., J. A. McMurty, H. H. Shorey, and V. Voth", # 31
163
+ "Ferrari, E. von ", # 32
164
+ "Whitaker J. O., Jr., D. Rubin and J. R. Munsee", # 33
165
+ "Palisot de Beauvois, A. M. F. J.", # 34
166
+ "Maa, T.-C. and K.-S. Lin", # 35
167
+ "Costa Lima, A. M. da, C. A. Campos Seabra, and C. R. Hathaway", # 36
168
+ "Falcon, L. A., R. van den Bosch, C. A. Ferris, L. K. Stromberg, L. K. Etzel, R. E. Stinner, and T. F. Leigh", # 37
169
+ "Kinzer, R. E., J. W. Davis, Jr., J. R. Coppedge, and S. L. Jones", # 38
170
+ "Doesburg, P. H. van, Jr. " # 39
171
+ ]
172
+
173
+ lexer = Taxonifi::Splitter::Lexer.new(auths[39])
174
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
175
+ assert_equal ['Doesburg'], t.names.collect{|n| n[:last_name] }
176
+ assert_equal "van Jr.", t.names[0][:suffix]
177
+
178
+ lexer = Taxonifi::Splitter::Lexer.new(auths[38])
179
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
180
+ assert_equal ['Kinzer', 'Davis', 'Coppedge', 'Jones'], t.names.collect{|n| n[:last_name] }
181
+ assert_equal "Jr.", t.names[1][:suffix]
182
+
183
+ lexer = Taxonifi::Splitter::Lexer.new(auths[37])
184
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
185
+ assert_equal ['Falcon', 'van den Bosch', 'Ferris', 'Stromberg', 'Etzel', 'Stinner', 'Leigh'], t.names.collect{|n| n[:last_name] }
186
+ assert_equal [%w{L A}, %w{R}, %w{C A}] , t.names[0..2].collect{|n| n[:initials] }
187
+
188
+ lexer = Taxonifi::Splitter::Lexer.new(auths[36])
189
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
190
+ assert_equal ['Costa Lima', 'Campos Seabra', 'Hathaway'], t.names.collect{|n| n[:last_name] }
191
+ assert_equal [%w{A M}, %w{C A}, %w{C R}] , t.names.collect{|n| n[:initials] }
192
+ assert_equal "da" , t.names.first[:suffix]
193
+
194
+ lexer = Taxonifi::Splitter::Lexer.new(auths[35])
195
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
196
+ assert_equal ['Maa', 'Lin'], t.names.collect{|n| n[:last_name] }
197
+ assert_equal [%w{T -C}, %w{K -S}] , t.names.collect{|n| n[:initials] }
198
+
199
+ lexer = Taxonifi::Splitter::Lexer.new(auths[32])
200
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
201
+ assert_equal ['Ferrari'], t.names.collect{|n| n[:last_name] }
202
+ assert_equal [%w{E}] , t.names.collect{|n| n[:initials] }
203
+ assert_equal ['von'] , t.names.collect{|n| n[:suffix] }
204
+
205
+ lexer = Taxonifi::Splitter::Lexer.new(auths[31])
206
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
207
+ assert_equal ['Oatman', 'McMurty', 'Shorey', 'Voth'], t.names.collect{|n| n[:last_name] }
208
+ assert_equal [%w{E R}, %w{J A}, %w{H H}, %w{V}] , t.names.collect{|n| n[:initials] }
209
+
210
+ lexer = Taxonifi::Splitter::Lexer.new(auths[30])
211
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
212
+ assert_equal ["McPherson", "Smith", "Allen"], t.names.collect{|n| n[:last_name] }
213
+ assert_equal [%w{R M}, %w{J C}, %w{W A}] , t.names.collect{|n| n[:initials] }
214
+
215
+ lexer = Taxonifi::Splitter::Lexer.new(auths[29])
216
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
217
+ assert_equal ["Ward", "O'Brien", "O'Brien", "Foster", "Huddleston" ], t.names.collect{|n| n[:last_name] }
218
+ assert_equal [%w{C R}, %w{C W}, %w{L B}, %w{D E}, %w{E W}] , t.names.collect{|n| n[:initials] }
219
+
220
+ lexer = Taxonifi::Splitter::Lexer.new(auths[28])
221
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
222
+ assert_equal ["Van Steenwyk", "Toscano", "Ballmer", "Kido", "Reynolds" ], t.names.collect{|n| n[:last_name] }
223
+ assert_equal [%w{R A}, %w{N C}, %w{G R}, %w{K}, %w{H T}] , t.names.collect{|n| n[:initials] }
224
+
225
+ lexer = Taxonifi::Splitter::Lexer.new(auths[27])
226
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
227
+ assert_equal ["O'Donnell", "Slater" ], t.names.collect{|n| n[:last_name] }
228
+ assert_equal [["J", "E"],["J", "A"]] , t.names.collect{|n| n[:initials] }
229
+
230
+ lexer = Taxonifi::Splitter::Lexer.new(auths[26])
231
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
232
+ assert_equal ["Slater", "O'Donnell"], t.names.collect{|n| n[:last_name] }
233
+ assert_equal [["J", "A"],["J", "E"]] , t.names.collect{|n| n[:initials] }
234
+
235
+ lexer = Taxonifi::Splitter::Lexer.new(auths[25])
236
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
237
+ assert_equal ["van den Bosch", "Hagen"], t.names.collect{|n| n[:last_name] }
238
+ assert_equal [["R"],["K"]] , t.names.collect{|n| n[:initials] }
239
+
240
+ lexer = Taxonifi::Splitter::Lexer.new(auths[24])
241
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
242
+ assert_equal ["Usinger", "Ashlock"], t.names.collect{|n| n[:last_name] }
243
+ assert_equal [["R", "L"],["P", "D"]] , t.names.collect{|n| n[:initials] }
244
+
245
+ lexer = Taxonifi::Splitter::Lexer.new(auths[23])
246
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
247
+ assert_equal ["Vollenhoven"], t.names.collect{|n| n[:last_name] }
248
+ assert_equal [["S", "C", "S"]] , t.names.collect{|n| n[:initials] }
249
+
250
+ lexer = Taxonifi::Splitter::Lexer.new(auths[22])
251
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
252
+ assert_equal ["Torre-Bueno"], t.names.collect{|n| n[:last_name] }
253
+ assert_equal [["J", "R"]] , t.names.collect{|n| n[:initials] }
254
+ assert_equal "de la", t.names.first[:suffix]
255
+
256
+ lexer = Taxonifi::Splitter::Lexer.new(auths[21])
257
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
258
+ assert_equal ["Wilson", "Gutierrez"], t.names.collect{|n| n[:last_name] }
259
+ assert_equal [["L", "T"], ["A", "P"]] , t.names.collect{|n| n[:initials] }
260
+
261
+ lexer = Taxonifi::Splitter::Lexer.new(auths[20])
262
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
263
+ assert_equal ["Wheeler", "Stinner", "Henry"], t.names.collect{|n| n[:last_name] }
264
+ assert_equal [["A", "G"], ["B", "R"], ["T", "J"]] , t.names.collect{|n| n[:initials] }
265
+ assert_equal "Jr.", t.names.first[:suffix]
266
+
267
+ lexer = Taxonifi::Splitter::Lexer.new(auths[19])
268
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
269
+ assert_equal ["Wheeler", "Henry"], t.names.collect{|n| n[:last_name] }
270
+ assert_equal [["A", "G"], ["T", "J"]] , [t.names.first[:initials], t.names.last[:initials]]
271
+ assert_equal "Jr.", t.names.first[:suffix]
272
+
273
+ lexer = Taxonifi::Splitter::Lexer.new(auths[18])
274
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
275
+ assert_equal ["Watson", "Langston", "Fullerton", "Rakickas", "Engroff", "Rokey", "Bricker"], t.names.collect{|n| n[:last_name] }
276
+ assert_equal [["T", "F"], ["L"]] , [t.names.first[:initials], t.names.last[:initials]]
277
+
278
+ lexer = Taxonifi::Splitter::Lexer.new(auths[17])
279
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
280
+ assert_equal 1, t.names.size
281
+ assert_equal "Walker", t.names[0][:last_name]
282
+ assert_equal ["F"], t.names[0][:initials]
283
+
284
+ lexer = Taxonifi::Splitter::Lexer.new(auths[16])
285
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
286
+ assert_equal 1, t.names.size
287
+ assert_equal "Van Duzee", t.names[0][:last_name]
288
+
289
+ lexer = Taxonifi::Splitter::Lexer.new(auths[15])
290
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
291
+ assert_equal 3, t.names.size
292
+ assert_equal "Smith", t.names[0][:last_name]
293
+ assert_equal "Jones", t.names[1][:last_name]
294
+ assert_equal "Simon", t.names[2][:last_name]
295
+
296
+ lexer = Taxonifi::Splitter::Lexer.new(auths[14])
297
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
298
+ assert_equal 1, t.names.size
299
+ assert_equal "Smith", t.names[0][:last_name]
300
+
301
+ lexer = Taxonifi::Splitter::Lexer.new(auths[12])
302
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
303
+ assert_equal 2, t.names.size
304
+ assert_equal "Smith", t.names[0][:last_name]
305
+ assert_equal "Barnes", t.names[1][:last_name]
306
+
307
+ lexer = Taxonifi::Splitter::Lexer.new(auths[13])
308
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
309
+ assert_equal 2, t.names.size
310
+ assert_equal "Smith", t.names[0][:last_name]
311
+ assert_equal "Barnes", t.names[1][:last_name]
312
+
313
+ lexer = Taxonifi::Splitter::Lexer.new(auths[0])
314
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
315
+ assert_equal 3, t.names.size
316
+ assert_equal "Jepson", t.names[0][:last_name]
317
+ assert_equal "JE", t.names[0][:initials].join
318
+ assert_equal "Jarzembowski", t.names[2][:last_name]
319
+ assert_equal "EA", t.names[2][:initials].join
320
+
321
+ lexer = Taxonifi::Splitter::Lexer.new(auths[1])
322
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
323
+ assert_equal 2, t.names.size
324
+ assert_equal "Ren", t.names[0][:last_name]
325
+ assert_equal "D", t.names[0][:initials].join
326
+ assert_equal "Meng", t.names[1][:last_name]
327
+ assert_equal "X-m", t.names[1][:initials].join
328
+
329
+ lexer = Taxonifi::Splitter::Lexer.new(auths[9])
330
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
331
+ assert_equal 1, t.names.size
332
+ assert_equal "Hong", t.names[0][:last_name]
333
+ assert_equal "Y-C", t.names[0][:initials].join
334
+
335
+ lexer = Taxonifi::Splitter::Lexer.new(auths[11])
336
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
337
+ assert_equal 3, t.names.size
338
+ assert_equal "Foo", t.names[0][:last_name]
339
+ assert_equal "A", t.names[0][:initials].join
340
+ assert_equal "Bar", t.names[1][:last_name]
341
+ assert_equal "ZA", t.names[1][:initials].join
342
+ assert_equal "Smith-Blorf", t.names[2][:last_name]
343
+ assert_equal "A", t.names[2][:initials].join
344
+ end
345
+
346
+ def test_volume_number
347
+ lexer = Taxonifi::Splitter::Lexer.new("42(123)", :volume_number)
348
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
349
+ assert_equal "42", t.volume
350
+ assert_equal "123", t.number
351
+
352
+ lexer = Taxonifi::Splitter::Lexer.new("42:123", :volume_number)
353
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
354
+ assert_equal "42", t.volume
355
+ assert_equal "123", t.number
356
+
357
+ lexer = Taxonifi::Splitter::Lexer.new("42", :volume_number)
358
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
359
+ assert_equal "42", t.volume
360
+ assert_equal nil, t.number
361
+
362
+ lexer = Taxonifi::Splitter::Lexer.new("II(5)", :volume_number)
363
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
364
+ assert_equal "II", t.volume
365
+ assert_equal "5", t.number
366
+
367
+ lexer = Taxonifi::Splitter::Lexer.new("99A", :volume_number)
368
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
369
+ assert_equal "99A", t.volume
370
+ assert_equal nil, t.number
371
+
372
+ lexer = Taxonifi::Splitter::Lexer.new("99(2-3)", :volume_number)
373
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
374
+ assert_equal "99", t.volume
375
+ assert_equal "2-3", t.number
376
+
377
+ lexer = Taxonifi::Splitter::Lexer.new("8(c4)", :volume_number)
378
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
379
+ assert_equal "8", t.volume
380
+ assert_equal "c4", t.number
381
+
382
+ lexer = Taxonifi::Splitter::Lexer.new("74 (1/2)", :volume_number)
383
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
384
+ assert_equal "74", t.volume
385
+ assert_equal "1/2", t.number
386
+
387
+ lexer = Taxonifi::Splitter::Lexer.new("74(1/2)", :volume_number)
388
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::VolumeNumber)
389
+ assert_equal "74", t.volume
390
+ assert_equal "1/2", t.number
391
+ end
392
+
393
+ def test_pages
394
+ ["1-10", "1-10.", "1-10, something", "1-10. something"].each do |p|
395
+ lexer = Taxonifi::Splitter::Lexer.new(p, :pages)
396
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Pages)
397
+ assert_equal "1", t.pg_start
398
+ assert_equal "10", t.pg_end
399
+ end
400
+ end
401
+
402
+ end
403
+
@@ -0,0 +1,11 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/taxonifi'))
3
+
4
+ class TestTaxonifi < Test::Unit::TestCase
5
+
6
+ def test_constants
7
+ assert Taxonifi::RANKS
8
+ end
9
+
10
+
11
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/assessor/assessor'))
3
+
4
+ class Test_TaxonifiAccessor < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @headers = ["family", "genus", "species", "author", "year"]
8
+ @csv_string = CSV.generate() do |csv|
9
+ csv << @headers
10
+ csv << ["Fooidae", "Foo", "bar", "Smith", "1854"]
11
+ end
12
+
13
+ @csv = CSV.parse(@csv_string, {headers: true})
14
+ end
15
+
16
+ def test_first_available
17
+ assert_equal [:family, 'Fooidae'], Taxonifi::Assessor::RowAssessor.first_available(@csv.first, [:family, :genus])
18
+ end
19
+
20
+ def test_last_available
21
+ assert_equal [:genus, 'Foo'], Taxonifi::Assessor::RowAssessor.last_available(@csv.first, [:family, :genus])
22
+ end
23
+
24
+ def test_lump_name_rank
25
+ assert_equal :species, Taxonifi::Assessor::RowAssessor.lump_name_rank(@csv.first)
26
+ @csv << ["Fooidae"]
27
+ assert_equal :family, Taxonifi::Assessor::RowAssessor.lump_name_rank(@csv[1])
28
+ @csv << ["Fooidae", "Blorf"]
29
+ assert_equal :genus, Taxonifi::Assessor::RowAssessor.lump_name_rank(@csv[2])
30
+ end
31
+
32
+ def test_lump_rank_parent
33
+ assert_equal ["genus", "Foo"], Taxonifi::Assessor::RowAssessor.parent_taxon_column(@csv.first)
34
+ end
35
+
36
+ def test_intersecting_lumps_with_data
37
+
38
+ headers = ["authors"]
39
+ csv_string = CSV.generate() do |csv|
40
+ csv << headers
41
+ csv << ["Smith J. and Barnes S."]
42
+ end
43
+ csv = CSV.parse(csv_string, {headers: true})
44
+ assert_equal [:citation_basic, :citation_small], Taxonifi::Assessor::RowAssessor.intersecting_lumps_with_data(csv.first)
45
+ end
46
+
47
+ def test_lumps_with_data
48
+
49
+ headers = Taxonifi::Lumper::LUMPS[:citation_small]
50
+ csv_string = CSV.generate() do |csv|
51
+ csv << headers
52
+ csv << ["Smith J. and Barnes S.", 1912, "Foo", "Bar", "3(4)", "1-2"]
53
+ end
54
+
55
+ csv = CSV.parse(csv_string, {headers: true})
56
+
57
+ assert_equal [:citation_small], Taxonifi::Assessor::RowAssessor.lumps_with_data(csv.first)
58
+ end
59
+
60
+ end
61
+
@@ -0,0 +1,51 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/name'))
3
+
4
+ class TestTaxonifiGeog < Test::Unit::TestCase
5
+
6
+ def test_new_name
7
+ assert n = Taxonifi::Model::Geog.new()
8
+ end
9
+
10
+ def test_that_geog_has_a_name
11
+ n = Taxonifi::Model::Geog.new()
12
+ assert n.respond_to?(:name)
13
+ end
14
+
15
+ def test_that_geog_has_a_rank
16
+ n = Taxonifi::Model::Geog.new()
17
+ assert n.respond_to?(:rank)
18
+ end
19
+
20
+ def test_that_geog_rank_is_checked
21
+ n = Taxonifi::Model::Geog.new()
22
+ assert_raise Taxonifi::GeogError do
23
+ n.rank = 'Foo'
24
+ end
25
+ assert n.rank = 'country'
26
+ end
27
+
28
+ def test_that_setting_a_parent_checks_for_nil
29
+ p = Taxonifi::Model::Geog.new()
30
+ c = Taxonifi::Model::Geog.new()
31
+ c.rank = 'state'
32
+ assert_raise Taxonifi::GeogError do
33
+ c.parent = nil
34
+ end
35
+ end
36
+
37
+ def test_that_geog_rank_for_parents_is_checked
38
+ p = Taxonifi::Model::Geog.new()
39
+ c = Taxonifi::Model::Geog.new()
40
+
41
+ c.rank = 'state'
42
+ p.rank = 'country'
43
+
44
+ assert_raise Taxonifi::GeogError do
45
+ p.parent = c
46
+ end
47
+
48
+ assert c.parent = p
49
+ end
50
+
51
+ end