fit 1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. data/README.txt +203 -0
  2. data/Rakefile +111 -0
  3. data/bin/FitServer.rb +6 -0
  4. data/bin/fit +10 -0
  5. data/bin/fit.cgi +36 -0
  6. data/doc/examples/AllCombinations.html +55 -0
  7. data/doc/examples/AllFiles.html +60 -0
  8. data/doc/examples/AllPairs/function/cosine.html +57 -0
  9. data/doc/examples/AllPairs/function/sine.html +57 -0
  10. data/doc/examples/AllPairs/magnitude/180+30.html +45 -0
  11. data/doc/examples/AllPairs/magnitude/30.html +33 -0
  12. data/doc/examples/AllPairs/magnitude/360+30.html +45 -0
  13. data/doc/examples/AllPairs/magnitude/90-30.html +45 -0
  14. data/doc/examples/AllPairs/sign/change-sign.html +27 -0
  15. data/doc/examples/AllPairs/sign/multiply.html +31 -0
  16. data/doc/examples/AllPairs/sign/no-change.html +23 -0
  17. data/doc/examples/AllPairs.html +51 -0
  18. data/doc/examples/BinaryChop.html +89 -0
  19. data/doc/examples/CalculatorExample.html +108 -0
  20. data/doc/examples/ColumnIndex.html +43 -0
  21. data/doc/examples/ExampleTests.html +43 -0
  22. data/doc/examples/FitAcceptanceTests.html +53 -0
  23. data/doc/examples/GeoCoordinate.html +87 -0
  24. data/doc/examples/MusicExample.html +143 -0
  25. data/doc/examples/MusicExampleWithErrors.html +128 -0
  26. data/doc/examples/NetworkExample.html +47 -0
  27. data/doc/examples/WebPageExample.html +92 -0
  28. data/doc/examples/arithmetic.html +211 -0
  29. data/doc/examples/files/hp35bk.jpg +0 -0
  30. data/doc/examples/logo.gif +0 -0
  31. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.FixtureParameters.html +81 -0
  32. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.GracefulFixtureNames.html +87 -0
  33. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.GracefulMemberNames.html +73 -0
  34. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.ImportFixture.html +61 -0
  35. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.WaysToSpecifyaFixtureNamespace.html +81 -0
  36. data/doc/spec/annotation.html +3833 -0
  37. data/doc/spec/extensions.html +302 -0
  38. data/doc/spec/fixtures.html +5181 -0
  39. data/doc/spec/index.html +947 -0
  40. data/doc/spec/parse.html +3094 -0
  41. data/lib/eg/all_combinations.rb +44 -0
  42. data/lib/eg/all_files.rb +94 -0
  43. data/lib/eg/all_pairs.rb +172 -0
  44. data/lib/eg/arithmetic_column_fixture.rb +35 -0
  45. data/lib/eg/arithmetic_fixture.rb +29 -0
  46. data/lib/eg/binary_chop.rb +100 -0
  47. data/lib/eg/calculator.rb +69 -0
  48. data/lib/eg/column_index.rb +85 -0
  49. data/lib/eg/division.rb +13 -0
  50. data/lib/eg/echo_args_fixture.rb +9 -0
  51. data/lib/eg/example_tests.rb +84 -0
  52. data/lib/eg/music/Music.txt +38 -0
  53. data/lib/eg/music/browser.rb +60 -0
  54. data/lib/eg/music/display.rb +24 -0
  55. data/lib/eg/music/music.rb +67 -0
  56. data/lib/eg/music/music_library.rb +70 -0
  57. data/lib/eg/music/music_player.rb +77 -0
  58. data/lib/eg/music/realtime.rb +39 -0
  59. data/lib/eg/music/simulator.rb +81 -0
  60. data/lib/eg/nested/bob.rb +12 -0
  61. data/lib/eg/nested/bob_the_builder_fixture.rb +11 -0
  62. data/lib/eg/net/simulator.rb +69 -0
  63. data/lib/eg/page.rb +91 -0
  64. data/lib/eg/sqrt.rb +19 -0
  65. data/lib/fat/annotation_fixture.rb +83 -0
  66. data/lib/fat/color.rb +45 -0
  67. data/lib/fat/divide.rb +13 -0
  68. data/lib/fat/document_parse_fixture.rb +67 -0
  69. data/lib/fat/equals.rb +59 -0
  70. data/lib/fat/fixture_name_fixture.rb +67 -0
  71. data/lib/fat/html_to_text_fixture.rb +20 -0
  72. data/lib/fat/money.rb +18 -0
  73. data/lib/fat/output_fixture.rb +32 -0
  74. data/lib/fat/parse_fixture.rb +92 -0
  75. data/lib/fat/reference_fixture.rb +31 -0
  76. data/lib/fat/standard_annotation_fixture.rb +58 -0
  77. data/lib/fat/string_writer.rb +12 -0
  78. data/lib/fat/table.rb +23 -0
  79. data/lib/fat/table_parse_fixture.rb +33 -0
  80. data/lib/fat/text_to_html_fixture.rb +21 -0
  81. data/lib/fit/action_fixture.rb +65 -0
  82. data/lib/fit/column_fixture.rb +104 -0
  83. data/lib/fit/file_runner.rb +80 -0
  84. data/lib/fit/fit_protocol.rb +62 -0
  85. data/lib/fit/fit_server.rb +173 -0
  86. data/lib/fit/fixture.rb +309 -0
  87. data/lib/fit/fixture_loader.rb +75 -0
  88. data/lib/fit/import_fixture.rb +9 -0
  89. data/lib/fit/parse.rb +206 -0
  90. data/lib/fit/primitive_fixture.rb +52 -0
  91. data/lib/fit/row_fixture.rb +188 -0
  92. data/lib/fit/scientific_double.rb +70 -0
  93. data/lib/fit/summary.rb +46 -0
  94. data/lib/fit/timed_action_fixture.rb +35 -0
  95. data/lib/fit/type_adapter.rb +95 -0
  96. data/lib/fit/wiki_runner.rb +15 -0
  97. data/lib/fittask.rb +184 -0
  98. data/test/all_tests.rb +13 -0
  99. data/test/file_runner_test.rb +52 -0
  100. data/test/fit_server_test.rb +214 -0
  101. data/test/fixture_loader_test.rb +71 -0
  102. data/test/fixture_test.rb +41 -0
  103. data/test/fixtures/fail_fixture.rb +9 -0
  104. data/test/fixtures/pass_fixture.rb +9 -0
  105. data/test/framework_test.rb +51 -0
  106. data/test/parse_test.rb +101 -0
  107. data/test/row_fixture_test.rb +44 -0
  108. data/test/scientific_double_test.rb +35 -0
  109. data/test/type_adapter_test.rb +120 -0
  110. metadata +165 -0
@@ -0,0 +1,214 @@
1
+ # Written by Object Mentor, Inc. 2005
2
+ # Copyright (c) 2002 Cunningham & Cunningham, Inc.
3
+ # Released under the terms of the GNU General Public License version 2 or later.
4
+
5
+ # Make the test run location independent
6
+ $:.unshift File.dirname(__FILE__)
7
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
8
+
9
+ require 'test/unit'
10
+ require 'socket'
11
+ require 'fit/fit_server'
12
+
13
+ module Fit
14
+ class FitServerTest < Test::Unit::TestCase
15
+
16
+ def setup
17
+ @fit_server = FitServer.new
18
+ @read_end_of_pipe, @write_end_of_pipe = IO.pipe
19
+ end
20
+
21
+ def teardown
22
+ @session.close if @session != nil
23
+ @server.close if @server != nil
24
+ @server_thread.kill if @server_thread != nil and @server_thread.alive?
25
+ end
26
+
27
+ def test_args
28
+ success = @fit_server.args(['localhost', '80', '123'])
29
+ assert(success);
30
+ check_standard_fit_server_parameters
31
+ end
32
+
33
+ def test_args_with_verbose
34
+ success = @fit_server.args(['-v', 'localhost', '80', '123'])
35
+ assert(success)
36
+ assert(@fit_server.verbose)
37
+ check_standard_fit_server_parameters
38
+ end
39
+
40
+ def test_bad_args
41
+ assert(! @fit_server.args(['-x', 'localhost', '80', '123']))
42
+ assert(! @fit_server.args(['-x', 'localhost', '80']))
43
+ assert(! @fit_server.args(['localhost', '80', '123', 'blah']))
44
+ assert(! @fit_server.args(['localhost', 'abc', '123']))
45
+ end
46
+
47
+ def check_standard_fit_server_parameters
48
+ assert_equal('localhost', @fit_server.host)
49
+ assert_equal(80, @fit_server.port)
50
+ assert_equal('123', @fit_server.test_ticket)
51
+ end
52
+
53
+ def test_build_request
54
+ @fit_server.test_ticket = "12345"
55
+ expected_request = "GET /?responder=socketCatcher&ticket=12345 HTTP/1.1\r\n\r\n"
56
+ assert_equal(expected_request, @fit_server.build_request)
57
+ end
58
+
59
+ def test_read_size
60
+ @write_end_of_pipe.print("0000000000")
61
+ assert_equal(0, FitProtocol.read_size(@read_end_of_pipe))
62
+ @write_end_of_pipe.print("0000000001")
63
+ assert_equal(1, FitProtocol.read_size(@read_end_of_pipe))
64
+ @write_end_of_pipe.print("00000123450000000021")
65
+ assert_equal(12345, FitProtocol.read_size(@read_end_of_pipe))
66
+ assert_equal(21, FitProtocol.read_size(@read_end_of_pipe))
67
+ end
68
+
69
+ def test_establish_connection
70
+ startSession do
71
+ @session.print('0000000000')
72
+ @session.flush
73
+ end
74
+ @fit_server.establish_connection()
75
+ assert(@fit_server.good_connection?)
76
+ end
77
+
78
+ def test_validate_connection
79
+ message = "This would normally be an error message"
80
+ message_length = '00000000' + message.length.to_s
81
+ startSession do
82
+ @session.print(message_length)
83
+ @session.print(message)
84
+ @session.flush
85
+ end
86
+ @fit_server.establish_connection()
87
+ assert(! @fit_server.good_connection?)
88
+ assert_equal(message, @fit_server.reason_for_bad_connection)
89
+ end
90
+
91
+ def test_run_one_passing_table
92
+ startSession do
93
+ FitProtocol.write_size(0, @session)
94
+ FitProtocol.write_document(passing_table, @session)
95
+ FitProtocol.write_size(0, @session)
96
+ end
97
+ @fit_server.establish_connection()
98
+ @fit_server.process()
99
+ results = FitProtocol.read_document(@session)
100
+ FitProtocol.read_size(@session)
101
+ counts = FitProtocol.read_counts(@session)
102
+ assert_not_nil(results.index("<td bgcolor=\"#cfffcf\">"), results)
103
+ check_counts(counts, 1, 0, 0, 0)
104
+ assert_equal(0, @fit_server.exit_code)
105
+ end
106
+
107
+ def test_run_one_failing_table
108
+ startSession do
109
+ FitProtocol.write_size(0, @session)
110
+ FitProtocol.write_document(failing_table, @session)
111
+ FitProtocol.write_size(0, @session)
112
+ end
113
+ @fit_server.establish_connection()
114
+ @fit_server.process()
115
+ results = FitProtocol.read_document(@session)
116
+ FitProtocol.read_size(@session)
117
+ counts = FitProtocol.read_counts(@session)
118
+ assert_not_nil(results.index("<td bgcolor=\"#ffcfcf\">"), results)
119
+ check_counts(counts, 0, 1, 0, 0)
120
+ assert_equal(1, @fit_server.exit_code)
121
+ end
122
+
123
+ def test_two_tables_in_one_document
124
+ startSession do
125
+ FitProtocol.write_size(0, @session)
126
+ FitProtocol.write_document(passing_table + "\n" + failing_table, @session)
127
+ FitProtocol.write_size(0, @session)
128
+ end
129
+ @fit_server.establish_connection()
130
+ @fit_server.process()
131
+ passing_results = FitProtocol.read_document(@session)
132
+ failing_results = FitProtocol.read_document(@session)
133
+ FitProtocol.read_size(@session)
134
+ counts = FitProtocol.read_counts(@session)
135
+ assert_not_nil(passing_results.index("<td bgcolor=\"#cfffcf\">"), passing_results)
136
+ assert_nil(passing_results.index("FailFixture"), "Shouldn't have second table in output")
137
+ assert_not_nil(failing_results.index("<td bgcolor=\"#ffcfcf\">"), failing_results)
138
+ check_counts(counts, 1, 1, 0, 0)
139
+ assert_equal(1, @fit_server.exit_code)
140
+ end
141
+
142
+ def test_processing_two_documents
143
+ startSession do
144
+ FitProtocol.write_size(0, @session)
145
+ FitProtocol.write_document(passing_table, @session)
146
+ FitProtocol.write_document(failing_table, @session)
147
+ FitProtocol.write_size(0, @session)
148
+ end
149
+ @fit_server.establish_connection()
150
+ @fit_server.process()
151
+ passing_results = FitProtocol.read_document(@session)
152
+ FitProtocol.read_size(@session)
153
+ passingCounts = FitProtocol.read_counts(@session)
154
+ failing_results = FitProtocol.read_document(@session)
155
+ FitProtocol.read_size(@session)
156
+ failingCounts = FitProtocol.read_counts(@session)
157
+ assert_not_nil(passing_results.index("<td bgcolor=\"#cfffcf\">"), passing_results)
158
+ assert_not_nil(failing_results.index("<td bgcolor=\"#ffcfcf\">"), failing_results)
159
+ check_counts(passingCounts, 1, 0, 0, 0)
160
+ check_counts(failingCounts, 0, 1, 0, 0)
161
+ assert_equal(1, @fit_server.exit_code)
162
+ end
163
+
164
+ def test_non_test_input
165
+ startSession do
166
+ FitProtocol.write_size(0, @session)
167
+ FitProtocol.write_document("Hey! There's no table here!'", @session)
168
+ FitProtocol.write_size(0, @session)
169
+ end
170
+ @fit_server.establish_connection()
171
+ @fit_server.process()
172
+ results = FitProtocol.read_document(@session)
173
+ FitProtocol.read_size(@session)
174
+ counts = FitProtocol.read_counts(@session)
175
+ assert_not_nil(results.index("Exception"))
176
+ assert_not_nil(results.index("Can't find tag: table"))
177
+ check_counts(counts, 0, 0, 0, 1)
178
+ assert_equal(1, @fit_server.exit_code)
179
+ end
180
+
181
+ def check_counts (counts, right, wrong, ignores, exceptions)
182
+ assert_equal(right, counts.right, "rights wrong")
183
+ assert_equal(wrong, counts.wrong, "wrongs wrong")
184
+ assert_equal(ignores, counts.ignores, "ignores wrong")
185
+ assert_equal(exceptions, counts.exceptions, "exceptions wrong")
186
+ end
187
+
188
+ def startSession (&connectionAction)
189
+ @fit_server.args(['localhost', '9002', '123'])
190
+ @server_thread = Thread.new do
191
+ begin
192
+ @server = TCPServer.new('localhost', 9002)
193
+ @session = @server.accept
194
+ request = @session.readline
195
+ @session.readline
196
+ rescue => e
197
+ puts e
198
+ end
199
+
200
+ yield connectionAction
201
+ end
202
+ sleep(0.1)
203
+ end
204
+
205
+ def passing_table
206
+ return "<table><tr><td>fixtures::PassFixture</td></tr></table>"
207
+ end
208
+
209
+ def failing_table
210
+ return "<table><tr><td>fixtures::FailFixture</td></tr></table>"
211
+ end
212
+
213
+ end
214
+ end
@@ -0,0 +1,71 @@
1
+ # Copyright (c) 2002 Cunningham & Cunningham, Inc.
2
+ # Released under the terms of the GNU General Public License version 2 or later.
3
+
4
+ require 'test/unit'
5
+
6
+ # Make the test run location independent
7
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
8
+
9
+ require 'fit/fixture_loader'
10
+ require 'fit/import_fixture'
11
+ require 'eg/division'
12
+ require 'eg/all_files'
13
+ require 'eg/nested/bob_the_builder_fixture'
14
+ require 'eg/music/browser'
15
+
16
+ module Fit
17
+ class FixtureLoaderTest < Test::Unit::TestCase
18
+ def setup
19
+ @loader = FixtureLoader.new
20
+ end
21
+ def test_you_can_load_a_fixture
22
+ assert_instance_of(Eg::Division, @loader.load('Eg.Division'))
23
+ end
24
+ def test_java_simple_fixture
25
+ assert_instance_of(Eg::AllFiles, @loader.load('eg.AllFiles'))
26
+ end
27
+ def test_java_nested_fixture
28
+ assert_instance_of(Eg::AllFiles::Expand, @loader.load('eg.AllFiles$Expand'))
29
+ end
30
+ def test_you_can_load_a_fixture_with_colons_rather_than_dots
31
+ assert_instance_of(Eg::Nested::BobTheBuilderFixture, @loader.load('Eg::Nested::BobTheBuilderFixture'))
32
+ end
33
+ class LookImNotInTheRightPlace < Fixture
34
+ end
35
+ def test_you_can_load_any_fixture_already_loaded_regardless_of_path
36
+ assert_instance_of(Fit::FixtureLoaderTest::LookImNotInTheRightPlace,
37
+ @loader.load('Fit.FixtureLoaderTest.LookImNotInTheRightPlace'))
38
+ end
39
+ def test_you_can_add_fixture_packages
40
+ FixtureLoader.add_fixture_package('Eg::Music')
41
+ assert_instance_of(Eg::Music::Browser, @loader.load('Browser'))
42
+ end
43
+ def test_it_finds_fixtures_in_the_fit_module
44
+ assert_instance_of(Fit::ImportFixture, @loader.load('ImportFixture'))
45
+ end
46
+ def test_it_adds_fixture_to_the_end_if_it_cant_find_the_class
47
+ assert_instance_of(Fit::ImportFixture, @loader.load('Import'))
48
+ end
49
+ def test_it_camalizes_seperated_words
50
+ FixtureLoader.add_fixture_package('Eg::Nested')
51
+ assert_instance_of(Eg::Nested::BobTheBuilderFixture, @loader.load('bob the builder fixture'))
52
+ assert_instance_of(Eg::Nested::BobTheBuilderFixture, @loader.load('bob the builder'))
53
+ end
54
+ def test_punctuation_seperates_words
55
+ FixtureLoader.add_fixture_package('Eg::Nested')
56
+ assert_instance_of(Eg::Nested::BobTheBuilderFixture, @loader.load('bob_the!-builder,fixture.'))
57
+ assert_instance_of(Eg::Nested::BobTheBuilderFixture, @loader.load('bob_the!-builder.'))
58
+ end
59
+ def test_it_raises_when_it_cant_find_the_fixture
60
+ @loader.load "NoSuchClass"
61
+ rescue StandardError => e
62
+ assert_equal("Fixture NoSuchClass not found.", e.to_s)
63
+ end
64
+ def test_it_only_loads_fixtures
65
+ @loader.load "String"
66
+ flunk("Should have thrown.")
67
+ rescue StandardError => e
68
+ assert_equal("String is not a fixture.", e.to_s)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,41 @@
1
+ # Copyright (c) 2002 Cunningham & Cunningham, Inc.
2
+ # Released under the terms of the GNU General Public License version 2 or later.
3
+
4
+ require 'test/unit'
5
+ # Make the test run location independent
6
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
7
+ require 'fit/fixture'
8
+ require 'fit/parse'
9
+
10
+ module Fit
11
+
12
+ class FixtureTest < Test::Unit::TestCase
13
+ def test_escape
14
+ junk = "!@$%^*()_-+={}|[]\\:\";',./?`#"
15
+ assert_equal junk, Fixture.escape(junk)
16
+
17
+ assert_equal ' &nbsp; &nbsp; ', Fixture.escape(' ')
18
+ assert_equal '', Fixture.escape('')
19
+ assert_equal '&lt;', Fixture.escape('<')
20
+ assert_equal '&lt;&lt;', Fixture.escape('<<')
21
+ assert_equal 'x&lt;', Fixture.escape('x<')
22
+ assert_equal '&amp;', Fixture.escape('&')
23
+ assert_equal '&lt;&amp;&lt;', Fixture.escape('<&<')
24
+ assert_equal '&amp;&lt;&amp;', Fixture.escape('&<&')
25
+ assert_equal 'a &lt; b &amp;&amp; c &lt; d', Fixture.escape('a < b && c < d')
26
+ assert_equal 'a<br />b', Fixture.escape("a\nb")
27
+ end
28
+ class ArgsFixture < Fit::Fixture
29
+ @@args = nil
30
+ def do_table table
31
+ @@args = @args
32
+ end
33
+ def self.args; @@args; end
34
+ end
35
+ def test_it_passes_parameters
36
+ p = Parse.new '<table><tr><td>Fit.FixtureTest.ArgsFixture</td><td>a</td><td>b</td></tr></table>'
37
+ Fixture.new.do_tables p
38
+ assert_equal ['a', 'b'], ArgsFixture.args
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,9 @@
1
+ require 'fit/fixture'
2
+
3
+ module Fixtures
4
+ class FailFixture < Fit::Fixture
5
+ def do_table(table)
6
+ wrong(table.parts.parts)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'fit/fixture'
2
+
3
+ module Fixtures
4
+ class PassFixture < Fit::Fixture
5
+ def do_table(table)
6
+ right(table.parts.parts)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ # Copyright (c) 2002 Cunningham & Cunningham, Inc.
2
+ # Released under the terms of the GNU General Public License version 2 or later.
3
+
4
+ require 'test/unit'
5
+ # Make the test run location independent
6
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
7
+ require 'fit/fixture'
8
+ require 'fit/parse'
9
+
10
+ module Fit
11
+
12
+ class FrameworkTest < Test::Unit::TestCase
13
+ def test_runs
14
+ # The original Java version for the arithmetic fixture led to
15
+ # 37, 10, 0, 2 as results, but Ruby handles maths differently.
16
+ # Using a more strict delta in Fit::TypeAdapter could lead to
17
+ # worse results on the Ruby front.
18
+ run_page 'arithmetic', 39, 8, 0, 2
19
+ run_page 'BinaryChop', 95, 0, 0, 0
20
+ run_page 'CalculatorExample', 75, 9, 0, 0
21
+ run_page 'MusicExample', 95, 0, 0, 0
22
+ run_page 'MusicExampleWithErrors', 54, 10, 0, 0
23
+ run_page 'NetworkExample', 5, 0, 0, 0
24
+ # run_page 'SimpleExample', 5, 0, 0, 0
25
+ end
26
+ def run_page file, right, wrong, ignores, exceptions
27
+ input = File.open("../../examples/#{file}.html") {|f| f.read}
28
+ fixture = Fixture.new
29
+ tables = nil
30
+ unless input.index('<wiki>').nil?
31
+ tables = Parse.new input, ['wiki', 'table', 'tr', 'td']
32
+ fixture.do_tables tables.parts
33
+ else
34
+ tables = Parse.new input, ['table', 'tr', 'td']
35
+ fixture.do_tables tables
36
+ end
37
+ tables.print OutputStream.new
38
+
39
+ assert_equal right, fixture.counts.right, "#{file} right"
40
+ assert_equal wrong, fixture.counts.wrong, "#{file} wrong"
41
+ assert_equal ignores, fixture.counts.ignores, "#{file} ignores"
42
+ assert_equal exceptions, fixture.counts.exceptions, "#{file} exceptions"
43
+ end
44
+ end
45
+
46
+ # A dummy output stream to avoid creating output files
47
+ class OutputStream < String
48
+ def print text; end
49
+ end
50
+
51
+ end
@@ -0,0 +1,101 @@
1
+ # Copyright (c) 2002 Cunningham & Cunningham, Inc.
2
+ # Released under the terms of the GNU General Public License version 2 or later.
3
+
4
+ require 'test/unit'
5
+ # Make the test run location independent
6
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
7
+ require 'fit/parse'
8
+
9
+ module Fit
10
+
11
+ class ParseTest < Test::Unit::TestCase
12
+ def test_parsing
13
+ p = Parse.new 'leader<Table foo=2>body</table>trailer', ['table']
14
+ assert_equal 'leader', p.leader
15
+ assert_equal '<Table foo=2>', p.tag
16
+ assert_equal 'body', p.body
17
+ assert_equal 'trailer', p.trailer
18
+ end
19
+ def test_recursing
20
+ p = Parse.new 'leader<table><TR><Td>body</tD></TR></table>trailer'
21
+ assert_nil p.body
22
+ assert_nil p.parts.body
23
+ assert_equal 'body', p.parts.parts.body
24
+ end
25
+ def test_iterating
26
+ p = Parse.new 'leader<table><tr><td>one</td><td>two</td><td>three</td></tr></table>trailer'
27
+ assert_equal 'one', p.parts.parts.body
28
+ assert_equal 'two', p.parts.parts.more.body
29
+ assert_equal 'three', p.parts.parts.more.more.body
30
+ end
31
+ def test_indexing
32
+ p = Parse.new 'leader<table><tr><td>one</td><td>two</td><td>three</td></tr><tr><td>four</td></tr></table>trailer'
33
+ assert_equal 'one', p.at(0, 0, 0).body
34
+ assert_equal 'two', p.at(0,0,1).body
35
+ assert_equal 'three', p.at(0,0,2).body
36
+ assert_equal 'three', p.at(0,0,3).body
37
+ assert_equal 'three', p.at(0,0,4).body
38
+ assert_equal 'four', p.at(0,1,0).body
39
+ assert_equal 'four', p.at(0,1,1).body
40
+ assert_equal 'four', p.at(0,2,0).body
41
+ assert_equal 1, p.size()
42
+ assert_equal 2, p.parts.size()
43
+ assert_equal 3, p.parts.parts.size()
44
+ assert_equal 'one', p.leaf().body
45
+ assert_equal 'four', p.parts.last().leaf().body
46
+ end
47
+ def test_parse_exception
48
+ begin
49
+ p = Parse.new 'leader<table><tr><th>one</th><th>two</th><th>three</th></tr><tr><td>four</td></tr></table>trailer'
50
+ fail 'Expected ParseException not thrown.'
51
+ rescue ParseException => e
52
+ assert_equal 17, e.error_offset
53
+ assert_equal "Can't find tag: td", e.message
54
+ end
55
+ end
56
+ def test_text
57
+ tags = ['td']
58
+ p = Parse.new '<td>a&lt;b</td>', tags
59
+ assert_equal 'a&lt;b', p.body
60
+ assert_equal 'a<b', p.text
61
+ p = Parse.new "<td>\ta&gt;b&nbsp;&amp;&nbsp;b>c &&&lt;</td>", tags
62
+ assert_equal 'a>b & b>c &&<', p.text
63
+ p = Parse.new "<td>\ta&gt;b&nbsp;&amp;&nbsp;b>c &&lt;</td>", tags
64
+ assert_equal 'a>b & b>c &<', p.text
65
+ p = Parse.new '<TD><P><FONT FACE="Arial" SIZE=2>GroupTestFixture</FONT></TD>', tags
66
+ assert_equal 'GroupTestFixture', p.text()
67
+ end
68
+ def test_html_to_text
69
+ assert_equal '', Parse.html_to_text('&nbsp;')
70
+ assert_equal 'a b', Parse.html_to_text('a <tag /> b')
71
+ assert_equal 'a', Parse.html_to_text('a &nbsp;')
72
+ assert_equal '&nbsp;', Parse.html_to_text('&amp;nbsp;')
73
+ assert_equal '1 2', Parse.html_to_text('1 &nbsp; &nbsp; 2')
74
+ assert_equal '1 2', Parse.html_to_text("1 \xa0\xa0\xa0\xa02")
75
+ assert_equal 'a', Parse.html_to_text(' <tag />a')
76
+ assert_equal "a\nb", Parse.html_to_text('a<br />b')
77
+ assert_equal 'ab', Parse.html_to_text('<font size=+1>a</font>b')
78
+ assert_equal 'ab', Parse.html_to_text('a<font size=+1>b</font>')
79
+ assert_equal 'a<b', Parse.html_to_text('a<b')
80
+ assert_equal "a\nb\nc\nd", Parse.html_to_text('a<br>b<br/>c< br / >d')
81
+ assert_equal "a\nb", Parse.html_to_text('a</p><p>b')
82
+ assert_equal "a\nb", Parse.html_to_text('a< / p > < p >b')
83
+ end
84
+ def test_unescape
85
+ assert_equal 'a<b', Parse.unescape('a&lt;b')
86
+ assert_equal 'a>b & b>c &&', Parse.unescape('a&gt;b&nbsp;&amp;&nbsp;b>c &&')
87
+ assert_equal '&amp;&amp;', Parse.unescape('&amp;amp;&amp;amp;')
88
+ assert_equal 'a>b & b>c &&', Parse.unescape('a&gt;b&nbsp;&amp;&nbsp;b>c &&')
89
+ assert_equal "'\"\"'", Parse.unescape("\221��\222")
90
+ end
91
+ def test_whitespace_is_condensed
92
+ assert_equal 'a b', Parse.condense_whitespace(' a b ')
93
+ assert_equal 'a b', Parse.condense_whitespace(" a \n\tb ")
94
+ assert_equal '', Parse.condense_whitespace(' ')
95
+ assert_equal '', Parse.condense_whitespace(' ')
96
+ assert_equal '', Parse.condense_whitespace(' ')
97
+ assert_equal '', Parse.condense_whitespace("\240")
98
+ end
99
+ end
100
+
101
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright (c) 2002 Cunningham & Cunningham, Inc.
2
+ # Released under the terms of the GNU General Public License version 2 or later.
3
+
4
+ require 'test/unit'
5
+ # Make the test run location independent
6
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
7
+ require 'fit/row_fixture'
8
+
9
+ module Fit
10
+
11
+ class RowFixtureTest < Test::Unit::TestCase
12
+
13
+ def test_match
14
+ fixture = TestRowFixture.new
15
+ adapter = TypeAdapter.for(fixture, 'get_strings', false)
16
+ fixture.column_bindings = [adapter]
17
+ computed = [BusinessObject.new(["1"])]
18
+ expected = [ParseHolder.create('tr', '', ParseHolder.create('td', '1', nil, nil), nil)]
19
+ fixture.match expected, computed, 0
20
+
21
+ puts fixture.counts.to_s # 0, 0, 0, 0 (!!!)
22
+ puts fixture.missing.size # 1
23
+ puts fixture.surplus.size # 1
24
+ assert_equal 1, fixture.counts.right, 'right'
25
+ assert_equal 0, fixture.counts.exceptions, 'exceptions'
26
+ assert_equal 0, fixture.missing.size, 'missing'
27
+ assert_equal 0, fixture.surplus.size, 'surplus'
28
+ end
29
+
30
+ class BusinessObject
31
+ def initialize strings
32
+ @strings = strings
33
+ end
34
+ def get_strings
35
+ @strings
36
+ end
37
+ end
38
+
39
+ class TestRowFixture < RowFixture
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,35 @@
1
+ # Copyright (c) 2002 Cunningham & Cunningham, Inc.
2
+ # Released under the terms of the GNU General Public License version 2 or later.
3
+
4
+ require 'test/unit'
5
+ # Make the test run location independent
6
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
7
+ require 'fit/scientific_double'
8
+
9
+ module Fit
10
+
11
+ class ScientificDoubleTest < Test::Unit::TestCase
12
+ def test_pi_number
13
+ pi = 3.141592653
14
+ assert_equal pi, ScientificDouble.value_of('3.14')
15
+ assert_equal pi, ScientificDouble.value_of('3.142')
16
+ assert_equal pi, ScientificDouble.value_of('3.1416')
17
+ assert_equal pi, ScientificDouble.value_of('3.14159')
18
+ assert_equal pi, ScientificDouble.value_of('3.141592653')
19
+
20
+ assert_not_equal pi, ScientificDouble.value_of('3.140')
21
+ assert_not_equal pi, ScientificDouble.value_of('3.144')
22
+ assert_not_equal pi, ScientificDouble.value_of('3.1414')
23
+ assert_not_equal pi, ScientificDouble.value_of('3.141492651')
24
+ end
25
+ def test_avogadro_number
26
+ assert_equal 6.02e23, ScientificDouble.value_of('6.02e23')
27
+ assert_equal 6.024E23, ScientificDouble.value_of('6.02E23')
28
+ assert_equal 6.016e23, ScientificDouble.value_of('6.02e23')
29
+
30
+ assert_not_equal 6.026e23, ScientificDouble.value_of('6.02e23')
31
+ assert_not_equal 6.014e23, ScientificDouble.value_of('6.02e23')
32
+ end
33
+ end
34
+
35
+ end