Skip to content

Commit 37c356c

Browse files
committed
using shoulda context for clearer tests
1 parent 983933c commit 37c356c

File tree

3 files changed

+129
-117
lines changed

3 files changed

+129
-117
lines changed

.document

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
lib/**/*.rb
22
bin/*
3+
ext/*.c
34
-
45
features/**/*.feature
56
LICENSE.txt

test/test_document.rb

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,53 +3,59 @@
33

44
class TestDocument < Test::Unit::TestCase
55

6-
def test_create
7-
d = Document.create(0, 0.5, 1, 0, [[1, 1.0 ], [4, 0.0] , [10, 0.0] ,[ 11, 0.5 ]])
8-
assert_kind_of Document, d
9-
end
10-
11-
def test_create_should_accept_integer_as_feature_weight
12-
d = Document.create(0, 0.5, 1, 0, [[1, 0 ], [4, 0.0] , [10, 0.0] ,[ 11, 0.5 ]])
13-
assert_kind_of Document, d
14-
end
6+
context "creating a new document" do
7+
8+
should "succed when using #create" do
9+
d = Document.create(0, 0.5, 1, 0, [[1, 1.0 ], [4, 0.0] , [10, 0.0] ,[ 11, 0.5 ]])
10+
assert_kind_of Document, d
11+
end
12+
13+
should "accept integers as feature weights" do
14+
d = Document.create(0, 0.5, 1, 0, [[1, 0 ], [4, 0.0] , [10, 0.0] ,[ 11, 0.5 ]])
15+
assert_kind_of Document, d
16+
end
17+
18+
should "create documents useing new as well" do
19+
d = Document.new({1 => 566.0, 4 => 133.0}, {docnum: 10, slackid: 1, queryid: 2, costfactor: 0.5})
20+
21+
assert_equal 10, d.docnum
22+
assert_equal 1, d.slackid
23+
assert_equal 2, d.queryid
24+
assert_equal 0.5, d.costfactor
25+
end
26+
27+
should "raise argument error if any of the word numbers is less or equal to 0" do
28+
assert_raise(ArgumentError){ Document.create(0, 0.5, 1, 0, [[0, 1.0 ], [10, 0.0 ], [20, 0.0], [21, 0.1 ]]) }
29+
assert_raise(ArgumentError){ Document.create(1, 0.5, 1, 0, [[-1, 1.0 ], [30, 0.0 ], [40, 0.0], [41, 0.1 ]])}
30+
end
31+
32+
should "raise type error when the fourth argument is not an array" do
33+
assert_raise(TypeError) { Document.create(-1, 0, 1, 0, {}) }
34+
end
35+
36+
should "raise type error when the fourth argument is empty" do
37+
assert_raise(ArgumentError) { Document.create(-1, 0, 1, 0 [])}
38+
end
1539

16-
def test_create_using_new
17-
d = Document.new({1 => 566.0, 4 => 133.0}, {docnum: 10, slackid: 1, queryid: 2, costfactor: 0.5})
18-
19-
assert_equal 10, d.docnum
20-
assert_equal 1, d.slackid
21-
assert_equal 2, d.queryid
22-
assert_equal 0.5, d.costfactor
2340
end
41+
42+
context 'a document' do
43+
should "have accessible docnum, queryid, slackid, and, costfacor" do
44+
d1 = Document.create(0, 0.5, 1, 0, [[1, 1.0 ], [10, 0.0 ], [20, 0.0], [21, 0.1 ]])
45+
d2 = Document.create(1, 0.6, 2, 1, [[1, 1.0 ], [30, 0.0 ], [40, 0.0], [41, 0.1 ]])
2446

25-
def test_should_be_able_to_access_properties
26-
d1 = Document.create(0, 0.5, 1, 0, [[1, 1.0 ], [10, 0.0 ], [20, 0.0], [21, 0.1 ]])
27-
d2 = Document.create(1, 0.6, 2, 1, [[1, 1.0 ], [30, 0.0 ], [40, 0.0], [41, 0.1 ]])
28-
29-
assert_equal 0, d1.docnum
30-
assert_equal 1, d2.docnum
31-
32-
assert_equal 1, d1.slackid
33-
assert_equal 2, d2.slackid
47+
assert_equal 0, d1.docnum
48+
assert_equal 1, d2.docnum
3449

35-
assert_equal 0, d1.queryid
36-
assert_equal 1, d2.queryid
50+
assert_equal 1, d1.slackid
51+
assert_equal 2, d2.slackid
3752

38-
assert_equal 0.5, d1.costfactor
39-
assert_equal 0.6, d2.costfactor
40-
end
41-
42-
def test_all_word_numbers_should_be_greater_than_zero
43-
assert_raise(ArgumentError){ Document.create(0, 0.5, 1, 0, [[0, 1.0 ], [10, 0.0 ], [20, 0.0], [21, 0.1 ]]) }
44-
assert_raise(ArgumentError){ Document.create(1, 0.5, 1, 0, [[-1, 1.0 ], [30, 0.0 ], [40, 0.0], [41, 0.1 ]])}
45-
end
46-
47-
def test_create_with_no_array
48-
assert_raise(TypeError) { Document.create(-1, 0, 1, 0, {}) }
49-
end
53+
assert_equal 0, d1.queryid
54+
assert_equal 1, d2.queryid
5055

51-
def test_create_with_empty_array
52-
assert_raise(ArgumentError) { Document.create(-1, 0, 1, 0 [])}
56+
assert_equal 0.5, d1.costfactor
57+
assert_equal 0.6, d2.costfactor
58+
end
5359
end
5460
end
5561

test/test_model.rb

Lines changed: 81 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -3,112 +3,117 @@
33

44
class TestModel < Test::Unit::TestCase
55

6-
def setup
7-
@features ||= [
8-
[ [1,0.6], [11, 0.0], [34, 0.1] ],
9-
[ [5,0.4], [15, 0.0], [30, 0.1] ],
10-
[ [1,0.1], [13, 0.0], [31, 0.1] ],
11-
[ [7,0.7], [15, 0.0], [35, 0.1] ],
12-
[ [5,0.6], [19, 0.0], [44, 0.1] ],
13-
]
14-
@docs_and_labels ||= @features.each_with_index.map{|f,i| [ Document.create(i + 1, 1, 0, 0, f), i%2 * -1]}
15-
end
6+
context "reading a model from file" do
7+
8+
setup do
9+
@file_name = 'test/assets/model'
10+
end
1611

17-
def test_learn_classification_with_alpha
18-
m = Model.new(:classification, @docs_and_labels, {}, {}, [1, 0.0] * 50)
19-
assert_kind_of Model, m
12+
should "read properly from a well formed file" do
13+
assert m = Model.read_from_file(@file_name)
14+
assert_equal 3877, m.support_vectors_count
15+
assert_equal 39118, m.total_words
16+
end
2017

21-
@docs_and_labels.each_with_index do |item, i|
22-
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
18+
should "classify successfully after reading the model from a file" do
19+
m = Model.read_from_file(@file_name)
20+
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1.0, 0, 0, 0, 0.5 ].each_with_index.map{|v, i| [i + 1 ,v.to_f]} ) )
21+
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1.0, 0, 0, 0, 0.5 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
22+
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1, 0, 0, 0, 0.8, 0, 0 , 0 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
23+
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1, 0.5, 0, 0, 0, 0 , 0 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
2324
end
2425
end
2526

26-
def test_learn_classification
27-
m = Model.new(:classification, @docs_and_labels, {}, {}, nil)
28-
assert_kind_of Model, m
29-
assert_equal 44, m.total_words
30-
assert_equal 5, m.totdoc
27+
context "when learning from new documents" do
3128

32-
@docs_and_labels.each_with_index do |item, i|
33-
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
29+
setup do
30+
@features ||= [
31+
[ [1,0.6], [11, 0.0], [34, 0.1] ],
32+
[ [5,0.4], [15, 0.0], [30, 0.1] ],
33+
[ [1,0.1], [13, 0.0], [31, 0.1] ],
34+
[ [7,0.7], [15, 0.0], [35, 0.1] ],
35+
[ [5,0.6], [19, 0.0], [44, 0.1] ],
36+
]
37+
38+
@docs_and_labels ||= @features.each_with_index.map do |feature, index|
39+
[ Document.create(index + 1, 1, 0, 0, feature), index%2 * -1]
40+
end
3441
end
3542

36-
end
43+
should "learn classification with default arguments" do
44+
m = Model.new(:classification, @docs_and_labels, {}, {}, nil)
45+
assert_kind_of Model, m
46+
assert_equal 44, m.total_words
47+
assert_equal 5, m.totdoc
48+
49+
@docs_and_labels.each_with_index do |item, i|
50+
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
51+
end
52+
end
53+
54+
should "learn classification with alpha values" do
55+
m = Model.new(:classification, @docs_and_labels, {}, {}, [1, 0.0] * 50)
56+
assert_kind_of Model, m
57+
58+
@docs_and_labels.each_with_index do |item, i|
59+
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
60+
end
61+
end
62+
63+
should "raise argument error when one of the alphas is not numeric " do
64+
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, {}, {}, [1, {}] )}
65+
end
3766

38-
def test_learn_classification_with_learn_params
39-
40-
learn_params = {
67+
should "learn classification and accept learn parameters" do
68+
learn_params = {
4169
"predfile" => "custom_file",
4270
"alphafile" => "alpha",
4371
"biased_hyperplane" => false,
4472
"sharedslack" => false,
4573
"remove_inconsistent" => true
46-
}
74+
}
4775

48-
m = Model.new(:classification, @docs_and_labels, learn_params, {}, nil)
49-
assert_kind_of Model, m
76+
m = Model.new(:classification, @docs_and_labels, learn_params, {}, nil)
77+
assert_kind_of Model, m
5078

51-
@docs_and_labels.each_with_index do |item, i|
52-
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
79+
@docs_and_labels.each_with_index do |item, i|
80+
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
81+
end
5382
end
54-
end
5583

56-
def test_learn_classification_with_invalid_learn_params
57-
learn_params = {"svm_c" => -1}
58-
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, learn_params, {}, nil)}
59-
learn_params = {"svm_iter_to_shrink" => -1}
60-
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, learn_params, {}, nil)}
61-
end
84+
should "raise argument error when learn parameters are invalid" do
85+
learn_params = {"svm_c" => -1}
86+
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, learn_params, {}, nil)}
87+
learn_params = {"svm_iter_to_shrink" => -1}
88+
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, learn_params, {}, nil)}
89+
end
90+
91+
should "learn calssification while accepting kernel paramters" do
6292

63-
def test_learn_classification_with_kernel_params
64-
65-
kernel_params = {
93+
kernel_params = {
6694
"poly_degree" => 3,
6795
"rbf_gamma" => 0.5,
6896
"coef_lin" => 0.4,
6997
"coef_const" => 0.56
70-
}
98+
}
7199

72-
m = Model.new(:classification, @docs_and_labels, {}, kernel_params, nil)
73-
assert_kind_of Model, m
100+
m = Model.new(:classification, @docs_and_labels, {}, kernel_params, nil)
101+
assert_kind_of Model, m
74102

75-
@docs_and_labels.each_with_index do |item, i|
76-
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
77-
end
78-
end
79-
80-
def test_learn_classification_with_learn_params_when_predfile_is_not_string
81-
82-
learn_params = { "predfile" => {}}
83-
84-
assert_raise(ArgumentError) do
85-
Model.new(:classification, @docs_and_labels, learn_params, {}, [1, 0.0, 1])
103+
@docs_and_labels.each_with_index do |item, i|
104+
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
105+
end
86106
end
87107

88-
end
108+
should "raise argument error when predfile is not string" do
89109

90-
def test_learn_classification_fails_when_element_is_not_array
91-
@docs_and_labels << []
92-
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, {}, {}, nil)}
93-
end
94-
95-
def test_learn_classification_fails_when_element_is_arry_with_the_wrong_types
96-
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, {}, {}, [1, {}] )}
97-
end
110+
learn_params = { "predfile" => {}}
98111

99-
def test_read
100-
assert m = Model.read_from_file('test/assets/model')
101-
assert_equal 3877, m.support_vectors_count
102-
assert_equal 39118, m.total_words
103-
end
112+
assert_raise(ArgumentError) do
113+
Model.new(:classification, @docs_and_labels, learn_params, {}, [1, 0.0, 1])
114+
end
115+
end
104116

105-
def test_classify
106-
m = Model.read_from_file('test/assets/model')
107-
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1.0, 0, 0, 0, 0.5 ].each_with_index.map{|v, i| [i + 1 ,v.to_f]} ) )
108-
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1.0, 0, 0, 0, 0.5 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
109-
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1, 0, 0, 0, 0.8, 0, 0 , 0 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
110-
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1, 0.5, 0, 0, 0, 0 , 0 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
111117
end
112-
113118
end
114119

0 commit comments

Comments
 (0)