taxonifi 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,186 @@
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 TestTaxonifiName < Test::Unit::TestCase
5
+
6
+ def test_truth
7
+ assert(true)
8
+ end
9
+
10
+ def test_new_name
11
+ assert n = Taxonifi::Model::Name.new()
12
+ end
13
+
14
+ def test_that_name_has_a_name
15
+ n = Taxonifi::Model::Name.new()
16
+ assert n.respond_to?(:name)
17
+ end
18
+
19
+ def test_that_name_has_an_id
20
+ n = Taxonifi::Model::Name.new()
21
+ assert n.respond_to?(:id)
22
+ end
23
+
24
+ def test_that_name_has_a_parent
25
+ n = Taxonifi::Model::Name.new()
26
+ assert n.respond_to?(:parent)
27
+ end
28
+
29
+ def test_that_name_has_a_rank
30
+ n = Taxonifi::Model::Name.new()
31
+ assert n.respond_to?(:rank)
32
+ end
33
+
34
+ def test_that_name_has_an_author
35
+ n = Taxonifi::Model::Name.new()
36
+ assert n.respond_to?(:author)
37
+ end
38
+
39
+ def test_that_name_has_a_year
40
+ n = Taxonifi::Model::Name.new()
41
+ assert n.respond_to?(:year)
42
+ end
43
+
44
+ def test_that_name_returns_false_with_bad_rank
45
+ n = Taxonifi::Model::Name.new()
46
+ assert_raise Taxonifi::NameError do
47
+ n.rank = "FOO"
48
+ end
49
+ end
50
+
51
+ def test_that_name_allows_legal_rank
52
+ n = Taxonifi::Model::Name.new()
53
+ assert n.rank = "genus"
54
+ end
55
+
56
+ def test_that_name_rank_is_case_insensitive
57
+ n = Taxonifi::Model::Name.new()
58
+ assert n.rank = "Genus"
59
+ assert n.rank = "GENUS"
60
+ end
61
+
62
+ def test_that_rank_is_required_before_parent
63
+ n = Taxonifi::Model::Name.new()
64
+ assert_raise Taxonifi::NameError do
65
+ n.parent = Taxonifi::Model::Name.new()
66
+ end
67
+ end
68
+
69
+ def test_that_parent_is_a_taxonifi_name
70
+ n = Taxonifi::Model::Name.new()
71
+ n.rank = "genus" # avoid that raise
72
+ assert_raise Taxonifi::NameError do
73
+ n.parent = "foo"
74
+ end
75
+ end
76
+
77
+ def test_that_rank_can_be_set
78
+ n = Taxonifi::Model::Name.new()
79
+ n.rank = "family"
80
+ assert_equal "family", n.rank
81
+ end
82
+
83
+
84
+ def test_that_parent_is_higher_rank_than_child
85
+ n = Taxonifi::Model::Name.new()
86
+ n.rank = "genus"
87
+ p = Taxonifi::Model::Name.new()
88
+ p.rank = "species"
89
+ assert_raise Taxonifi::NameError do
90
+ n.parent = p
91
+ end
92
+ end
93
+
94
+ def test_that_parent_can_be_set
95
+ n = Taxonifi::Model::Name.new()
96
+ n.rank = "genus"
97
+ p = Taxonifi::Model::Name.new()
98
+ p.rank = "species"
99
+ assert p.parent = n
100
+ assert_equal "genus", p.parent.rank
101
+ end
102
+
103
+ def test_that_attributes_can_be_assigned_on_new
104
+ n0 = Taxonifi::Model::Name.new(:name => "Baridae", :rank => "Family")
105
+ n = Taxonifi::Model::Name.new(:name => "Foo", :rank => "Genus", :author => "Frank", :year => 2020, :parent => n0)
106
+ assert_equal "Foo", n.name
107
+ assert_equal "genus", n.rank
108
+ assert_equal 2020, n.year
109
+ assert_equal "Frank", n.author
110
+ assert_equal n0, n.parent
111
+ end
112
+
113
+ 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 )
119
+ end
120
+
121
+ def test_ancestors
122
+ create_a_few_names
123
+ assert_equal [@n0, @n1], @n2.ancestors
124
+ end
125
+
126
+ def test_ancestor_ids
127
+ create_a_few_names
128
+ assert_equal [2,15], @n2.ancestor_ids
129
+ end
130
+
131
+ def test_parent_ids_sf_style
132
+ create_a_few_names
133
+ assert_equal '2-15-14g-19s-11', @n4.parent_ids_sf_style
134
+ assert_equal '2-15-14g-19s', @n3.parent_ids_sf_style
135
+ assert_equal '2-15-14g', @n2.parent_ids_sf_style
136
+ assert_equal '2-15', @n1.parent_ids_sf_style
137
+ end
138
+
139
+ def test_author_year_index
140
+ n = Taxonifi::Model::Name.new(author_year: 'Smith and Jones, 1920')
141
+ assert_equal '1920-||smith|-||jones|', n.author_year_index
142
+ end
143
+
144
+ #
145
+ # ICZN Subclass
146
+ #
147
+
148
+ def test_that_iczn_family_ends_in_idae
149
+ n = Taxonifi::Model::IcznName.new
150
+ assert_raise Taxonifi::NameError do
151
+ n.rank = "family"
152
+ n.name = "Foo"
153
+ end
154
+ end
155
+
156
+ def test_that_iczn_subfamily_ends_in_inae
157
+ n = Taxonifi::Model::IcznName.new
158
+ assert_raise Taxonifi::NameError do
159
+ n.rank = "subfamily"
160
+ n.name = "Foo"
161
+ end
162
+ end
163
+
164
+ def test_that_iczn_tribe_ends_in_ini
165
+ n = Taxonifi::Model::IcznName.new
166
+ assert_raise Taxonifi::NameError do
167
+ n.rank = "tribe"
168
+ n.name = "Foo"
169
+ end
170
+ end
171
+
172
+ def test_that_iczn_subtribe_ends_in_ina
173
+ n = Taxonifi::Model::IcznName.new
174
+ assert_raise Taxonifi::NameError do
175
+ n.rank = "subtribe"
176
+ n.name = "Foo"
177
+ end
178
+
179
+ assert n.name = "Fooina"
180
+ end
181
+
182
+
183
+
184
+
185
+
186
+ end
@@ -0,0 +1,158 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/name_collection'))
3
+
4
+ class TestTaxonifiNameCollection < Test::Unit::TestCase
5
+
6
+ def test_that_add_objects_adds_to_collection
7
+ c = Taxonifi::Model::NameCollection.new
8
+ n = Taxonifi::Model::Name.new
9
+ assert c.add_object(n)
10
+ assert_equal(1, c.collection.size)
11
+ end
12
+
13
+ def test_that_name_collections_have_collections
14
+ c = Taxonifi::Model::NameCollection.new
15
+ assert c.respond_to?(:collection)
16
+ assert_equal([], c.collection)
17
+ end
18
+
19
+ def test_that_name_collection_returns_encompassing_rank
20
+ c = Taxonifi::Model::NameCollection.new
21
+ n = Taxonifi::Model::Name.new
22
+ n.rank = 'species'
23
+ c.add_object(n)
24
+ assert_equal 'subgenus', c.encompassing_rank
25
+ end
26
+
27
+ def test_names_at_rank_returns_names
28
+ c = Taxonifi::Model::NameCollection.new
29
+ n = Taxonifi::Model::Name.new
30
+ n.rank = 'species'
31
+ c.add_object(n)
32
+
33
+ n1 = Taxonifi::Model::Name.new
34
+ n1.rank = 'species'
35
+ c.add_object(n1)
36
+
37
+ assert_equal 2, c.names_at_rank('species').size
38
+ end
39
+
40
+ def test_that_add_objects_tests_for_existing_name_id_and_raises
41
+ c = Taxonifi::Model::NameCollection.new
42
+ n = Taxonifi::Model::Name.new
43
+ n.rank = 'species'
44
+ n.id = 1
45
+ assert_raise Taxonifi::CollectionError do
46
+ c.add_object(n)
47
+ end
48
+ end
49
+
50
+ def test_that_current_free_id_is_incremented
51
+ c = Taxonifi::Model::NameCollection.new
52
+ n = Taxonifi::Model::Name.new
53
+ assert_equal 0, c.current_free_id
54
+ c.add_object(n)
55
+ assert_equal 1, c.current_free_id
56
+ end
57
+
58
+ def test_that_by_id_index_is_built
59
+ c = Taxonifi::Model::NameCollection.new
60
+ n = Taxonifi::Model::Name.new
61
+ assert_equal 0, c.current_free_id
62
+ c.add_object(n)
63
+ assert_equal ({0 => n}), c.by_id_index
64
+ end
65
+
66
+ def test_that_object_by_id_returns
67
+ c = Taxonifi::Model::NameCollection.new
68
+ n = Taxonifi::Model::Name.new
69
+ n.rank = 'species'
70
+ id = c.add_object(n).id
71
+ assert_equal id, c.object_by_id(id).id
72
+ end
73
+
74
+ def test_that_parent_id_vector_returns_a_id_vector
75
+ c = Taxonifi::Model::NameCollection.new
76
+
77
+ n1 = Taxonifi::Model::Name.new(:name => "Fooidae", :rank => "family")
78
+ n2 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "genus")
79
+ n3 = Taxonifi::Model::Name.new(:name => "blorf", :rank => "species")
80
+
81
+ assert_equal "family", n1.rank
82
+ assert_equal "genus", n2.rank
83
+ assert_equal "species", n3.rank
84
+
85
+ c.add_object(n1)
86
+ c.add_object(n2)
87
+ c.add_object(n3)
88
+
89
+ assert_equal 0, n1.id
90
+ assert_equal 1, n2.id
91
+ assert_equal 2, n3.id
92
+
93
+
94
+ n3.parent = n2
95
+ n2.parent = n1
96
+
97
+ # c.object_by_id(2).parent = c.object_by_id(1)
98
+ # c.object_by_id(1).parent = c.object_by_id(0)
99
+
100
+ assert_equal [0,1], c.parent_id_vector(2)
101
+ assert_equal [0], c.parent_id_vector(1)
102
+ end
103
+
104
+ def test_that_name_collection_indexes_by_name_as_well_as_id
105
+ c = Taxonifi::Model::NameCollection.new
106
+ n1 = Taxonifi::Model::Name.new(:name => "Fooidae", :rank => "family")
107
+ c.add_object(n1)
108
+ assert_equal "Fooidae", c.by_name_index['family'].keys.first
109
+ end
110
+
111
+ def test_name_exists?
112
+ c = Taxonifi::Model::NameCollection.new
113
+ n1 = Taxonifi::Model::Name.new(:name => "Fooidae", :rank => "family")
114
+ n2 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "genus", :parent => n1)
115
+ n3 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "genus", :parent => n1)
116
+ n4 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "subgenus", :parent => n2)
117
+ n5 = Taxonifi::Model::Name.new(:name => "foo", :rank => "species", :parent => n2)
118
+ n6 = Taxonifi::Model::Name.new(:name => "foo", :rank => "species", :parent => n2)
119
+ c.add_object(n1)
120
+ c.add_object(n2)
121
+ c.add_object(n5)
122
+ assert c.name_exists?(n3), "Name exists, but not caught."
123
+ assert c.name_exists?(n6), "Name exists, but not caught."
124
+ assert !c.name_exists?(n4), "Name doesn't exist, but asserted to."
125
+ assert_equal n2.id, c.name_exists?(n3)
126
+ end
127
+
128
+ def test_that_name_collection_generate_ref_collection
129
+ c = Taxonifi::Model::NameCollection.new
130
+ c.generate_ref_collection
131
+ assert rc = c.ref_collection
132
+ assert_equal Taxonifi::Model::RefCollection, rc.class
133
+ end
134
+
135
+ def test_that_name_collection_populates_ref_collection
136
+ c = Taxonifi::Model::NameCollection.new
137
+ n1 = Taxonifi::Model::Name.new(:name => "Fooidae", :rank => "family", :author => "Smith and Jones", :year => 2002)
138
+ n2 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "genus", :parent => n1)
139
+ n3 = Taxonifi::Model::Name.new(:name => "foo", :rank => "species", :parent => n2, :author => "Smith, Jones and Simon", :year => 2012)
140
+ n4 = Taxonifi::Model::Name.new(:name => "bar", :rank => "species", :parent => n2, :author => "Jones", :year => 2011)
141
+ n5 = Taxonifi::Model::Name.new(:name => "blorf", :rank => "species", :parent => n2, :author => "Jones", :year => 2011)
142
+
143
+ [n1,n2,n3,n4].each do |n|
144
+ c.add_object(n)
145
+ end
146
+
147
+ c.generate_ref_collection
148
+ assert_equal 3, c.ref_collection.collection.size
149
+ # References are sorted
150
+ assert_equal ['Jones'], c.ref_collection.collection.first.authors.collect{|r| r.last_name}
151
+ assert_equal ['Smith', 'Jones'], c.ref_collection.collection[1].authors.collect{|r| r.last_name}
152
+ assert_equal ['Smith', 'Jones', 'Simon'], c.ref_collection.collection.last.authors.collect{|r| r.last_name}
153
+ assert_equal 2011, c.ref_collection.collection.first.year
154
+ foo = 1
155
+ end
156
+
157
+ end
158
+
@@ -0,0 +1,90 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/ref'))
3
+
4
+ class TestTaxonifiRef < Test::Unit::TestCase
5
+
6
+ def test_new_ref
7
+ assert n = Taxonifi::Model::Ref.new()
8
+ end
9
+
10
+ def test_that_a_ref_has_authors
11
+ n = Taxonifi::Model::Ref.new()
12
+ assert n.respond_to?(:authors)
13
+ end
14
+
15
+ def test_that_a_ref_has_title
16
+ n = Taxonifi::Model::Ref.new()
17
+ assert n.respond_to?(:title)
18
+ end
19
+
20
+ def test_that_a_ref_has_year
21
+ n = Taxonifi::Model::Ref.new()
22
+ assert n.respond_to?(:year)
23
+ end
24
+
25
+ def test_that_a_ref_has_publication
26
+ n = Taxonifi::Model::Ref.new()
27
+ assert n.respond_to?(:publication)
28
+ end
29
+
30
+ def test_that_a_ref_has_volume_year
31
+ n = Taxonifi::Model::Ref.new()
32
+ assert n.respond_to?(:volume)
33
+ assert n.respond_to?(:year)
34
+ end
35
+
36
+ def test_that_a_ref_has_page_fields
37
+ n = Taxonifi::Model::Ref.new()
38
+ assert n.respond_to?(:pg_start)
39
+ assert n.respond_to?(:pg_end)
40
+ assert n.respond_to?(:pages)
41
+ assert n.respond_to?(:cited_page)
42
+ end
43
+
44
+ def create_a_ref
45
+ @ref = Taxonifi::Model::Ref.new(
46
+ :authors => [Taxonifi::Model::Person.new(:last_name => "Foo", :initials => "AC")],
47
+ :year => 2012,
48
+ :title => "Place to be",
49
+ :publication => "Journal Du Jour",
50
+ :pg_start => 1,
51
+ :pg_end => 2,
52
+ :volume => 3,
53
+ :number => 4
54
+ )
55
+ end
56
+
57
+ def test_identical?
58
+ create_a_ref
59
+ foo = @ref.clone
60
+ bar = @ref.clone
61
+ assert foo.identical?(bar)
62
+ bar.title = "Foo"
63
+ assert !foo.identical?(bar)
64
+ end
65
+
66
+ def test_that_ref_assigns_passed_options
67
+ create_a_ref
68
+ assert_equal "Place to be", @ref.title
69
+ assert_equal 4, @ref.number
70
+ end
71
+
72
+ def test_that_compact_string_is_compact
73
+ create_a_ref
74
+ assert_equal '|ac|foo||2012|placetobe|journaldujour|3|4||1|2|', @ref.compact_string
75
+ end
76
+
77
+ def test_that_author_year_strings_translate_to_author_years
78
+ r = Taxonifi::Model::Ref.new(:author_year => 'Smith and Jones, 1920')
79
+ assert_equal 2, r.authors.size
80
+ assert_equal 1920, r.year
81
+ end
82
+
83
+ def test_author_year_index
84
+ r = Taxonifi::Model::Ref.new(:author_year => 'Smith and Jones, 1920')
85
+ assert_equal '1920-||smith|-||jones|', r.author_year_index
86
+ end
87
+
88
+
89
+
90
+ end
@@ -0,0 +1,69 @@
1
+ require 'helper'
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/ref_collection'))
3
+
4
+ class TestTaxonifiCollection < Test::Unit::TestCase
5
+
6
+ def test_that_add_objects_adds_refs
7
+ c = Taxonifi::Model::RefCollection.new
8
+ n = Taxonifi::Model::Ref.new
9
+ assert c.add_object(n)
10
+ assert_equal(1, c.collection.size)
11
+ end
12
+
13
+ def test_that_ref_collections_have_refs
14
+ c = Taxonifi::Model::RefCollection.new
15
+ assert c.respond_to?(:collection)
16
+ assert_equal([], c.collection)
17
+ end
18
+
19
+ def test_that_add_objects_tests_for_existing_ref_id_and_raises
20
+ c = Taxonifi::Model::RefCollection.new
21
+ n = Taxonifi::Model::Ref.new
22
+ n.id = 1
23
+ assert_raise Taxonifi::CollectionError do
24
+ c.add_object(n)
25
+ end
26
+ end
27
+
28
+ def test_that_current_free_id_is_incremented
29
+ c = Taxonifi::Model::RefCollection.new
30
+ n = Taxonifi::Model::Ref.new
31
+ assert_equal 0, c.current_free_id
32
+ c.add_object(n)
33
+ assert_equal 1, c.current_free_id
34
+ end
35
+
36
+ def test_that_by_id_index_is_built
37
+ c = Taxonifi::Model::RefCollection.new
38
+ n = Taxonifi::Model::Ref.new
39
+ assert_equal 0, c.current_free_id
40
+ c.add_object(n)
41
+ assert_equal ({0 => n}), c.by_id_index
42
+ end
43
+
44
+ def test_that_object_by_id_returns
45
+ c = Taxonifi::Model::RefCollection.new
46
+ n = Taxonifi::Model::Ref.new
47
+ id = c.add_object(n).id
48
+ assert_equal id, c.object_by_id(id).id
49
+ end
50
+
51
+ def test_uniquify_authors
52
+ c = Taxonifi::Model::RefCollection.new
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
+ n = Taxonifi::Model::Ref.new(:author_year => a)
55
+ c.add_object(n)
56
+ end
57
+ assert_equal 4, c.unique_authors.size
58
+ assert_not_equal c.collection.first.authors.first, c.collection[1].authors.last
59
+ c.uniquify_authors(5)
60
+ assert_equal c.collection.first.authors.first, c.collection[1].authors.last
61
+ assert_equal c.collection.first.authors.first, c.collection[4].authors[1]
62
+ assert_equal c.collection[1].authors.first, c.collection[3].authors.first
63
+ assert_equal 5, c.collection.first.authors.first.id
64
+ end
65
+
66
+
67
+
68
+ end
69
+
@@ -0,0 +1,95 @@
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'))
3
+
4
+ class TestTaxonifiSpeciesName < Test::Unit::TestCase
5
+
6
+ def test_truth
7
+ assert(true)
8
+ end
9
+
10
+ def test_new_name
11
+ assert n = Taxonifi::Model::SpeciesName.new()
12
+ end
13
+
14
+ def test_that_name_has_a_genus
15
+ assert n = Taxonifi::Model::SpeciesName.new()
16
+ assert n.respond_to?(:genus)
17
+ end
18
+
19
+ def test_that_name_has_a_subgenus
20
+ assert n = Taxonifi::Model::SpeciesName.new()
21
+ assert n.respond_to?(:subgenus)
22
+ end
23
+
24
+ def test_that_name_has_a_species
25
+ assert n = Taxonifi::Model::SpeciesName.new()
26
+ assert n.respond_to?(:species)
27
+ end
28
+
29
+ def test_that_name_has_a_sub_species
30
+ assert n = Taxonifi::Model::SpeciesName.new()
31
+ assert n.respond_to?(:subspecies)
32
+ end
33
+
34
+ def test_that_parent_is_a_taxonifi_name
35
+ n = Taxonifi::Model::SpeciesName.new()
36
+ assert_raise Taxonifi::SpeciesNameError do
37
+ n.parent = "foo"
38
+ end
39
+ end
40
+
41
+ def test_that_parent_rank_must_be_higher_than_genus
42
+ n = Taxonifi::Model::SpeciesName.new()
43
+ p = Taxonifi::Model::Name.new()
44
+ p.rank = "species"
45
+ assert_raise Taxonifi::SpeciesNameError do
46
+ n.parent = p
47
+ end
48
+ end
49
+
50
+ def test_that_names_are_taxonifi_names
51
+ p = Taxonifi::Model::Name.new()
52
+ end
53
+
54
+ def test_that_genus_must_be_assigned_before_species
55
+ n = Taxonifi::Model::Name.new(:rank => 'species', :name => "foo")
56
+
57
+ assert_raise Taxonifi::SpeciesNameError do
58
+ sn = Taxonifi::Model::SpeciesName.new(:species => n)
59
+ end
60
+
61
+ n.rank = 'genus'
62
+ n.name = 'Foo'
63
+
64
+ assert sn = Taxonifi::Model::SpeciesName.new(:genus => n)
65
+ end
66
+
67
+ def test_that_species_must_be_assigned_before_subspecies
68
+ n = Taxonifi::Model::Name.new(:rank => 'subspecies', :name => "foo")
69
+ g = Taxonifi::Model::Name.new(:rank => 'genus', :name => "species")
70
+
71
+ assert_raise Taxonifi::SpeciesNameError do
72
+ sn = Taxonifi::Model::SpeciesName.new(:subspecies => n, :genus => g)
73
+ end
74
+ end
75
+
76
+ def test_display_name_formatting
77
+ g = Taxonifi::Model::Name.new(:rank => 'genus', :name => "Foo")
78
+ sg = Taxonifi::Model::Name.new(:rank => 'subgenus', :name => "Bar")
79
+ s = Taxonifi::Model::Name.new(:rank => 'species', :name => "stuff")
80
+ ss = Taxonifi::Model::Name.new(:rank => 'subspecies', :name => "things", :author => "Jones", :year => 2012 )
81
+
82
+ sn1 = Taxonifi::Model::SpeciesName.new(:genus => g, :species => s)
83
+ assert_equal "Foo stuff", sn1.display_name
84
+
85
+ sn2 = Taxonifi::Model::SpeciesName.new(:genus => g, :subgenus => sg, :species => s)
86
+ assert_equal "Foo (Bar) stuff", sn2.display_name
87
+
88
+ sn3 = Taxonifi::Model::SpeciesName.new(:genus => g, :subgenus => sg, :species => s, :subspecies => ss)
89
+ assert_equal "Foo (Bar) stuff things Jones, 2012", sn3.display_name
90
+
91
+ ss.parens = false
92
+ assert_equal "Foo (Bar) stuff things (Jones, 2012)", sn3.display_name
93
+ end
94
+
95
+ end