taxonifi 0.2.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +59 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +5 -17
  5. data/Gemfile.lock +22 -40
  6. data/README.md +192 -0
  7. data/Rakefile +35 -26
  8. data/lib/export/format/base.rb +1 -1
  9. data/lib/export/format/species_file.rb +154 -152
  10. data/lib/lumper/clump.rb +1 -1
  11. data/lib/lumper/lumper.rb +22 -18
  12. data/lib/lumper/lumps/parent_child_name_collection.rb +1 -2
  13. data/lib/lumper/name_index.rb +21 -0
  14. data/lib/{models → model}/author_year.rb +2 -2
  15. data/lib/{models → model}/base.rb +35 -5
  16. data/lib/{models → model}/collection.rb +8 -1
  17. data/lib/{models → model}/name.rb +128 -36
  18. data/lib/{models → model}/name_collection.rb +134 -33
  19. data/lib/{models → model}/person.rb +1 -1
  20. data/lib/{models → model}/ref.rb +4 -2
  21. data/lib/model/ref_collection.rb +171 -0
  22. data/lib/{models → model}/species_name.rb +24 -3
  23. data/lib/splitter/builder.rb +1 -1
  24. data/lib/splitter/parser.rb +5 -0
  25. data/lib/splitter/tokens.rb +54 -9
  26. data/lib/taxonifi/version.rb +3 -0
  27. data/lib/taxonifi.rb +5 -9
  28. data/taxonifi.gemspec +29 -99
  29. data/test/helper.rb +1 -1
  30. data/test/test_exporter.rb +1 -1
  31. data/test/test_lumper_names.rb +9 -9
  32. data/test/test_lumper_refs.rb +4 -4
  33. data/test/test_parser.rb +97 -26
  34. data/test/test_splitter_tokens.rb +25 -4
  35. data/test/test_taxonifi_base.rb +1 -1
  36. data/test/test_taxonifi_geog.rb +1 -1
  37. data/test/test_taxonifi_name.rb +13 -14
  38. data/test/test_taxonifi_name_collection.rb +11 -5
  39. data/test/test_taxonifi_ref.rb +1 -1
  40. data/test/test_taxonifi_ref_collection.rb +40 -3
  41. data/test/test_taxonifi_species_name.rb +51 -1
  42. data/travis/before_install.sh +2 -0
  43. metadata +96 -66
  44. data/README.rdoc +0 -154
  45. data/VERSION +0 -1
  46. data/lib/models/ref_collection.rb +0 -107
  47. /data/lib/{models → model}/generic_object.rb +0 -0
  48. /data/lib/{models → model}/geog.rb +0 -0
  49. /data/lib/{models → model}/geog_collection.rb +0 -0
  50. /data/lib/{models → model}/shared_class_methods.rb +0 -0
data/test/test_parser.rb CHANGED
@@ -2,35 +2,106 @@ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
2
  require File.expand_path(File.join(File.dirname(__FILE__), '../lib/splitter/parser'))
3
3
 
4
4
  class Test_TaxonifiSplitterParser < Test::Unit::TestCase
5
-
6
5
  # TODO: this could also go to builder related tests
6
+
7
7
  def test_that_parse_species_name_parses
8
- lexer = Taxonifi::Splitter::Lexer.new("Foo (Bar) stuff things (Smith, 1912)", :species_name)
9
- builder = Taxonifi::Model::SpeciesName.new
10
- Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
11
- assert_equal "Foo", builder.genus.name
12
- assert_equal "Bar", builder.subgenus.name
13
- assert_equal builder.genus, builder.subgenus.parent
14
- assert_equal "stuff", builder.species.name
15
- assert_equal builder.subgenus, builder.species.parent
16
- assert_equal "things", builder.subspecies.name
17
- assert_equal builder.species, builder.subspecies.parent
18
- assert_equal "Smith", builder.names.last.author
19
- assert_equal 1912, builder.names.last.year
20
- assert_equal true, builder.names.last.parens
21
- assert_equal "Foo (Bar) stuff things (Smith, 1912)", builder.display_name
22
-
23
- lexer = Taxonifi::Splitter::Lexer.new("Foo stuff things Smith, 1912", :species_name)
24
- builder = Taxonifi::Model::SpeciesName.new
25
- Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
26
- assert_equal "Foo", builder.genus.name
27
- assert_equal "stuff", builder.species.name
28
- assert_equal "things", builder.subspecies.name
29
- assert_equal "Smith", builder.names.last.author
30
- assert_equal 1912 , builder.names.last.year
31
- assert_equal false, builder.names.last.parens
32
- assert_equal "Foo stuff things Smith, 1912", builder.display_name
8
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff Smith, 1912", :species_name)
9
+ builder = Taxonifi::Model::SpeciesName.new
10
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
11
+ assert_equal "Foo", builder.genus.name
12
+ assert_equal "stuff", builder.species.name
13
+ assert_equal "Smith", builder.names.last.author
14
+ assert_equal 1912 , builder.names.last.year
15
+ assert_equal false, builder.names.last.parens
16
+ assert_equal "Foo stuff Smith, 1912", builder.display_name
17
+ end
18
+
19
+ def test_that_parse_species_name_parses_subspecies
20
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff things Smith, 1912", :species_name)
21
+ builder = Taxonifi::Model::SpeciesName.new
22
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
23
+ assert_equal "Foo", builder.genus.name
24
+ assert_equal "stuff", builder.species.name
25
+ assert_equal "things", builder.subspecies.name
26
+ assert_equal "Smith", builder.names.last.author
27
+ assert_equal 1912 , builder.names.last.year
28
+ assert_equal false, builder.names.last.parens
29
+ assert_equal "Foo stuff things Smith, 1912", builder.display_name
30
+ end
31
+
32
+ def test_that_parse_species_name_parses_subgenera
33
+ lexer = Taxonifi::Splitter::Lexer.new("Foo (Bar) stuff things (Smith, 1912)", :species_name)
34
+ builder = Taxonifi::Model::SpeciesName.new
35
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
36
+ assert_equal "Foo", builder.genus.name
37
+ assert_equal "Bar", builder.subgenus.name
38
+ assert_equal builder.genus, builder.subgenus.parent
39
+ assert_equal "stuff", builder.species.name
40
+ assert_equal builder.subgenus, builder.species.parent
41
+ assert_equal "things", builder.subspecies.name
42
+ assert_equal builder.species, builder.subspecies.parent
43
+ assert_equal "Smith", builder.names.last.author
44
+ assert_equal 1912, builder.names.last.year
45
+ assert_equal true, builder.names.last.parens
46
+ assert_equal "Foo (Bar) stuff things (Smith, 1912)", builder.display_name
47
+ end
48
+
49
+ def test_that_parse_species_name_parses_variety_following_subspecies
50
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff things var. blorf Smith, 1912", :species_name)
51
+ builder = Taxonifi::Model::SpeciesName.new
52
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
53
+ assert_equal "Foo", builder.genus.name
54
+ assert_equal "stuff", builder.species.name
55
+ assert_equal "things", builder.subspecies.name
56
+ assert_equal "blorf", builder.variety.name
57
+ assert_equal "Smith", builder.names.last.author
58
+ assert_equal 1912 , builder.names.last.year
59
+ assert_equal false, builder.names.last.parens
60
+ assert_equal "Foo stuff things var. blorf Smith, 1912", builder.display_name
61
+ end
62
+
63
+
64
+ def test_that_parse_species_name_parses_variety_following_species
65
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff v. blorf Smith, 1912", :species_name)
66
+ builder = Taxonifi::Model::SpeciesName.new
67
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
68
+ assert_equal "Foo", builder.genus.name
69
+ assert_equal "stuff", builder.species.name
70
+ assert_equal nil, builder.subspecies
71
+ assert_equal "blorf", builder.variety.name
72
+ assert_equal "Smith", builder.names.last.author
73
+ assert_equal 1912 , builder.names.last.year
74
+ assert_equal false, builder.names.last.parens
75
+ assert_equal "Foo stuff var. blorf Smith, 1912", builder.display_name
33
76
  end
34
77
 
78
+
79
+ def test_that_parse_species_name_parses_variety_following_species_without_author_year
80
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff v. blorf", :species_name)
81
+ builder = Taxonifi::Model::SpeciesName.new
82
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
83
+ assert_equal "Foo", builder.genus.name
84
+ assert_equal "stuff", builder.species.name
85
+ assert_equal nil, builder.subspecies
86
+ assert_equal "blorf", builder.variety.name
87
+ assert_equal nil, builder.names.last.parens # not set
88
+ assert_equal "Foo stuff var. blorf", builder.display_name
89
+ end
90
+
91
+
92
+ def test_that_parse_species_name_parses_variety_following_species_without_author_year_II
93
+ lexer = Taxonifi::Splitter::Lexer.new("Calyptonotus rolandri var. opacus", :species_name)
94
+ builder = Taxonifi::Model::SpeciesName.new
95
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
96
+ assert_equal "Calyptonotus", builder.genus.name
97
+ assert_equal "rolandri", builder.species.name
98
+ assert_equal nil, builder.subspecies
99
+ assert_equal "opacus", builder.variety.name
100
+ assert_equal nil, builder.names.last.parens # not set
101
+ assert_equal "Calyptonotus rolandri var. opacus", builder.display_name
102
+ end
103
+
104
+
105
+
35
106
  end
36
107
 
@@ -14,6 +14,21 @@ end
14
14
 
15
15
  class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
16
16
 
17
+ def test_variety
18
+ lexer = Taxonifi::Splitter::Lexer.new("var. blorf")
19
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Variety)
20
+
21
+ lexer = Taxonifi::Splitter::Lexer.new(" var. blorf")
22
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Variety)
23
+
24
+ lexer = Taxonifi::Splitter::Lexer.new("v. blorf")
25
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Variety)
26
+
27
+ lexer = Taxonifi::Splitter::Lexer.new(" v. blorf ")
28
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Variety)
29
+ end
30
+
31
+
17
32
  def test_year
18
33
  lexer = Taxonifi::Splitter::Lexer.new("1235")
19
34
  assert lexer.pop(Taxonifi::Splitter::Tokens::Year)
@@ -53,7 +68,7 @@ class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
53
68
  assert lexer.pop(Taxonifi::Splitter::Tokens::RightParen)
54
69
  end
55
70
 
56
- def test_right_paren
71
+ def test_comma
57
72
  lexer = Taxonifi::Splitter::Lexer.new(",")
58
73
  assert lexer.pop(Taxonifi::Splitter::Tokens::Comma)
59
74
  end
@@ -167,9 +182,15 @@ class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
167
182
  "Costa Lima, A. M. da, C. A. Campos Seabra, and C. R. Hathaway", # 36
168
183
  "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
184
  "Kinzer, R. E., J. W. Davis, Jr., J. R. Coppedge, and S. L. Jones", # 38
170
- "Doesburg, P. H. van, Jr. " # 39
185
+ "Doesburg, P. H. van, Jr. ", # 39
186
+ "Arias J. R., Young D. G." # 40
171
187
  ]
172
188
 
189
+ lexer = Taxonifi::Splitter::Lexer.new(auths[40])
190
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
191
+ assert_equal ['Arias', 'Young'], t.names.collect{|n| n[:last_name] }
192
+ assert_equal [%w{J R}, %w{D G}] , t.names[0..1].collect{|n| n[:initials] }
193
+
173
194
  lexer = Taxonifi::Splitter::Lexer.new(auths[39])
174
195
  assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
175
196
  assert_equal ['Doesburg'], t.names.collect{|n| n[:last_name] }
@@ -298,13 +319,13 @@ class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
298
319
  assert_equal 1, t.names.size
299
320
  assert_equal "Smith", t.names[0][:last_name]
300
321
 
301
- lexer = Taxonifi::Splitter::Lexer.new(auths[12])
322
+ lexer = Taxonifi::Splitter::Lexer.new(auths[13])
302
323
  assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
303
324
  assert_equal 2, t.names.size
304
325
  assert_equal "Smith", t.names[0][:last_name]
305
326
  assert_equal "Barnes", t.names[1][:last_name]
306
327
 
307
- lexer = Taxonifi::Splitter::Lexer.new(auths[13])
328
+ lexer = Taxonifi::Splitter::Lexer.new(auths[12])
308
329
  assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
309
330
  assert_equal 2, t.names.size
310
331
  assert_equal "Smith", t.names[0][:last_name]
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/base'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/base'))
3
3
 
4
4
  class TestTaxonifiBase < Test::Unit::TestCase
5
5
 
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/name'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/name'))
3
3
 
4
4
  class TestTaxonifiGeog < Test::Unit::TestCase
5
5
 
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/name'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/name'))
3
3
 
4
4
  class TestTaxonifiName < Test::Unit::TestCase
5
5
 
@@ -30,12 +30,12 @@ class TestTaxonifiName < Test::Unit::TestCase
30
30
  n = Taxonifi::Model::Name.new()
31
31
  assert n.respond_to?(:rank)
32
32
  end
33
-
33
+
34
34
  def test_that_name_has_an_author
35
35
  n = Taxonifi::Model::Name.new()
36
36
  assert n.respond_to?(:author)
37
37
  end
38
-
38
+
39
39
  def test_that_name_has_a_year
40
40
  n = Taxonifi::Model::Name.new()
41
41
  assert n.respond_to?(:year)
@@ -74,13 +74,12 @@ class TestTaxonifiName < Test::Unit::TestCase
74
74
  end
75
75
  end
76
76
 
77
- def test_that_rank_can_be_set
77
+ def test_that_rank_can_be_set
78
78
  n = Taxonifi::Model::Name.new()
79
79
  n.rank = "family"
80
80
  assert_equal "family", n.rank
81
81
  end
82
82
 
83
-
84
83
  def test_that_parent_is_higher_rank_than_child
85
84
  n = Taxonifi::Model::Name.new()
86
85
  n.rank = "genus"
@@ -111,11 +110,11 @@ class TestTaxonifiName < Test::Unit::TestCase
111
110
  end
112
111
 
113
112
  def create_a_few_names
114
- @n0 = Taxonifi::Model::Name.new(:name => "Baridae", :rank => "Family", :id => 2)
115
- @n1 = Taxonifi::Model::Name.new(:name => "Barinae", :rank => "Subfamily", :id => 15, :parent => @n0)
116
- @n2 = Taxonifi::Model::Name.new(:name => "Foo", :rank => "Genus", :author => "Frank", :year => 2020, :id => 14, :parent => @n1 )
117
- @n3 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "Subgenus", :author => "Frank", :year => 2020, :id => 19, :parent => @n2 )
118
- @n4 = Taxonifi::Model::Name.new(:name => "boo", :rank => "Species", :author => "Frank", :year => 2020, :id => 11, :parent => @n3 )
113
+ @n0 = Taxonifi::Model::Name.new(:name => "Baridae", :rank => "Family", :id => 2)
114
+ @n1 = Taxonifi::Model::Name.new(:name => "Barinae", :rank => "Subfamily", :id => 15, :parent => @n0)
115
+ @n2 = Taxonifi::Model::Name.new(:name => "Foo", :rank => "Genus", :author => "Frank", :year => 2020, :id => 14, :parent => @n1 )
116
+ @n3 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "Subgenus", :author => "Frank", :year => 2020, :id => 19, :parent => @n2 )
117
+ @n4 = Taxonifi::Model::Name.new(:name => "boo", :rank => "Species", :author => "Frank", :year => 2020, :id => 11, :parent => @n3 )
119
118
  end
120
119
 
121
120
  def dont_test_prologify
@@ -140,7 +139,7 @@ class TestTaxonifiName < Test::Unit::TestCase
140
139
  def test_nomenclator_name
141
140
  create_a_few_names
142
141
  n5 = Taxonifi::Model::Name.new(:name => "beep", :rank => "Subspecies", :author => "Frank", :year => 2020, :id => 11, :parent => @n4 )
143
-
142
+
144
143
  assert_equal 'Foo', @n2.nomenclator_name
145
144
  assert_equal 'Foo (Bar)', @n3.nomenclator_name
146
145
  assert_equal 'Foo (Bar) boo', @n4.nomenclator_name
@@ -165,14 +164,14 @@ class TestTaxonifiName < Test::Unit::TestCase
165
164
  assert_equal '2-15-14g', @n2.parent_ids_sf_style
166
165
  assert_equal '2-15', @n1.parent_ids_sf_style
167
166
  end
168
-
167
+
169
168
  def test_author_year_index
170
169
  n = Taxonifi::Model::Name.new(author_year: 'Smith and Jones, 1920')
171
170
  assert_equal '1920-||smith|-||jones|', n.author_year_index
172
171
  end
173
172
 
174
173
  def test_genus_group_parent
175
- n1 = Taxonifi::Model::Name.new(name: "Fooidae", rank: "family", author: nil , year: nil) #
174
+ n1 = Taxonifi::Model::Name.new(name: "Fooidae", rank: "family", author: nil, year: nil) #
176
175
  n2 = Taxonifi::Model::Name.new(name: "Foo", rank: "genus", author: nil , year: nil, :parent => n1) # Foo
177
176
  n3 = Taxonifi::Model::Name.new(name: "Bar", rank: "subgenus", author: nil , year: nil, :parent => n2) # Foo (Bar)
178
177
  n4 = Taxonifi::Model::Name.new(name: "aus", rank: "species", author: nil , year: nil, :parent => n3) # Foo (Bar) aus
@@ -185,7 +184,7 @@ class TestTaxonifiName < Test::Unit::TestCase
185
184
  #
186
185
  # ICZN Subclass
187
186
  #
188
-
187
+
189
188
  def test_that_iczn_family_ends_in_idae
190
189
  n = Taxonifi::Model::IcznName.new
191
190
  assert_raise Taxonifi::NameError do
@@ -161,6 +161,12 @@ class TestTaxonifiNameCollection < Test::Unit::TestCase
161
161
  assert_equal n11.id, c.name_exists?(n12)
162
162
  end
163
163
 
164
+ def test_that_name_collection_can_assign_ref_collections
165
+ r = Taxonifi::Model::RefCollection.new
166
+ c = Taxonifi::Model::NameCollection.new(:ref_collection => r)
167
+ assert c.ref_collection == r
168
+ end
169
+
164
170
  def test_that_name_collection_generate_ref_collection
165
171
  c = Taxonifi::Model::NameCollection.new
166
172
  c.generate_ref_collection
@@ -182,14 +188,14 @@ class TestTaxonifiNameCollection < Test::Unit::TestCase
182
188
 
183
189
  c.generate_ref_collection
184
190
  assert_equal 3, c.ref_collection.collection.size
185
- # References are sorted
186
- assert_equal ['Jones'], c.ref_collection.collection.first.authors.collect{|r| r.last_name}
187
- assert_equal ['Smith', 'Jones'], c.ref_collection.collection[1].authors.collect{|r| r.last_name}
188
- assert_equal ['Smith', 'Jones', 'Simon'], c.ref_collection.collection.last.authors.collect{|r| r.last_name}
189
- assert_equal 2011, c.ref_collection.collection.first.year
191
+ assert_equal ['Smith', 'Jones'], c.ref_collection.collection.first.authors.collect{|r| r.last_name}
192
+ assert_equal ['Smith', 'Jones', 'Simon'], c.ref_collection.collection[1].authors.collect{|r| r.last_name}
193
+ assert_equal ['Jones'], c.ref_collection.collection.last.authors.collect{|r| r.last_name}
194
+ assert_equal 2011, c.ref_collection.collection.last.year
190
195
  foo = 1
191
196
  end
192
197
 
193
198
 
199
+
194
200
  end
195
201
 
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/ref'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/ref'))
3
3
 
4
4
  class TestTaxonifiRef < Test::Unit::TestCase
5
5
 
@@ -1,7 +1,7 @@
1
1
  require 'helper'
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/ref_collection'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/ref_collection'))
3
3
 
4
- class TestTaxonifiCollection < Test::Unit::TestCase
4
+ class TestTaxonifiRefCollection < Test::Unit::TestCase
5
5
 
6
6
  def test_that_add_objects_adds_refs
7
7
  c = Taxonifi::Model::RefCollection.new
@@ -51,18 +51,55 @@ class TestTaxonifiCollection < Test::Unit::TestCase
51
51
  def test_uniquify_authors
52
52
  c = Taxonifi::Model::RefCollection.new
53
53
  ['Smith, A.R. 1920', 'Jones, A.R. and Smith, A.R. 1940', 'Jones, B. 1999', 'Jones, A. R. 1922', 'Jones, A. R., Smith, A.R. and Frank, A. 1943'].each do |a|
54
+ # smith ar
55
+ # jones ar
56
+ # jones b
57
+ # frank a
54
58
  n = Taxonifi::Model::Ref.new(:author_year => a)
55
59
  c.add_object(n)
56
60
  end
57
- assert_equal 4, c.unique_authors.size
61
+
62
+ assert_equal 8, c.all_authors.size
58
63
  assert_not_equal c.collection.first.authors.first, c.collection[1].authors.last
64
+
59
65
  c.uniquify_authors(5)
66
+ assert_equal 4, c.all_authors.size
60
67
  assert_equal c.collection.first.authors.first, c.collection[1].authors.last
61
68
  assert_equal c.collection.first.authors.first, c.collection[4].authors[1]
62
69
  assert_equal c.collection[1].authors.first, c.collection[3].authors.first
63
70
  assert_equal 5, c.collection.first.authors.first.id
64
71
  end
65
72
 
73
+ def test_uniquify_tricky_authors
74
+ c = Taxonifi::Model::RefCollection.new
75
+ ['Quate and Quate, 1920',].each do |a|
76
+ n = Taxonifi::Model::Ref.new(:author_year => a)
77
+ c.add_object(n)
78
+ end
79
+
80
+ assert_equal 2, c.unique_authors.size
81
+ c.uniquify_authors(0)
82
+ assert_equal 2, c.unique_authors.size
83
+ assert_not_equal c.collection.first.authors.first, c.collection.first.authors.last
84
+ end
85
+
86
+ def test_uniquify_trickier_authors
87
+ c = Taxonifi::Model::RefCollection.new
88
+ ['Quate and Quate, 1920', 'Quate, Smith and Quate, 1921', 'Smith, 1930', 'Quate, Quate, and Smith, 2000'].each do |a|
89
+ # Quate1
90
+ # Quate2
91
+ # Smith1
92
+ n = Taxonifi::Model::Ref.new(:author_year => a)
93
+ c.add_object(n)
94
+ end
95
+
96
+ assert_equal 9, c.all_authors.size
97
+ c.uniquify_authors(0)
98
+ assert_equal 3, c.unique_authors.size
99
+ # assert_not_equal c.collection.first.authors.first, c.collection.first.authors.last
100
+ end
101
+
102
+
66
103
 
67
104
 
68
105
  end
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/species_name'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/species_name'))
3
3
 
4
4
  class TestTaxonifiSpeciesName < Test::Unit::TestCase
5
5
 
@@ -92,4 +92,54 @@ class TestTaxonifiSpeciesName < Test::Unit::TestCase
92
92
  assert_equal "Foo (Bar) stuff things (Jones, 2012)", sn3.display_name
93
93
  end
94
94
 
95
+ def test_new_from_string_for_simple_species_name
96
+ string = "Foo bar Smith, 1920"
97
+ sn = Taxonifi::Model::SpeciesName.new_from_string(string)
98
+ assert_equal "Foo", sn.genus.name
99
+ assert_equal "bar", sn.species.name
100
+ assert_equal 1920, sn.species.year
101
+ assert_equal "Smith", sn.species.authors.first.last_name
102
+ end
103
+
104
+ def test_new_from_string_for_more_complex_species_name
105
+ string = 'Aus (Cus) bus dus (Smith, 1920)'
106
+ sn = Taxonifi::Model::SpeciesName.new_from_string(string)
107
+ assert_equal "Aus", sn.genus.name
108
+ assert_equal "Cus", sn.subgenus.name
109
+ assert_equal "bus", sn.species.name
110
+ assert_equal "dus", sn.subspecies.name
111
+ assert_equal 1920, sn.subspecies.year
112
+ assert_equal "Smith", sn.subspecies.authors.first.last_name
113
+ assert_equal true, sn.subspecies.parens
114
+ end
115
+
116
+ def test_new_from_simple_ampersand_authors
117
+ string = 'Pericoma deceptrix Quate & Brown, 2004'
118
+ sn = Taxonifi::Model::SpeciesName.new_from_string(string)
119
+ assert_equal "Pericoma", sn.genus.name
120
+ assert_equal nil, sn.subgenus
121
+ assert_equal "deceptrix", sn.species.name
122
+ assert_equal nil, sn.subspecies
123
+ assert_equal 2004, sn.species.year
124
+ assert_equal "Quate", sn.species.authors.first.last_name
125
+ assert_equal "Brown", sn.species.authors.last.last_name
126
+ assert_equal false, sn.species.parens
127
+ end
128
+
129
+ def test_new_from_simple_ampersand_parened_authors
130
+ string = 'Pericoma deceptrix (Quate & Brown, 2004)'
131
+ sn = Taxonifi::Model::SpeciesName.new_from_string(string)
132
+ assert_equal "Pericoma", sn.genus.name
133
+ assert_equal nil, sn.subgenus
134
+ assert_equal "deceptrix", sn.species.name
135
+ assert_equal nil, sn.subspecies
136
+ assert_equal 2004, sn.species.year
137
+ assert_equal "Quate", sn.species.authors.first.last_name
138
+ assert_equal "Brown", sn.species.authors.last.last_name
139
+ assert_equal true, sn.species.parens
140
+ end
141
+
142
+
143
+
144
+
95
145
  end
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ gem install bundler -v=1.9.4