fit 1.1
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.
- data/README.txt +203 -0
- data/Rakefile +111 -0
- data/bin/FitServer.rb +6 -0
- data/bin/fit +10 -0
- data/bin/fit.cgi +36 -0
- data/doc/examples/AllCombinations.html +55 -0
- data/doc/examples/AllFiles.html +60 -0
- data/doc/examples/AllPairs/function/cosine.html +57 -0
- data/doc/examples/AllPairs/function/sine.html +57 -0
- data/doc/examples/AllPairs/magnitude/180+30.html +45 -0
- data/doc/examples/AllPairs/magnitude/30.html +33 -0
- data/doc/examples/AllPairs/magnitude/360+30.html +45 -0
- data/doc/examples/AllPairs/magnitude/90-30.html +45 -0
- data/doc/examples/AllPairs/sign/change-sign.html +27 -0
- data/doc/examples/AllPairs/sign/multiply.html +31 -0
- data/doc/examples/AllPairs/sign/no-change.html +23 -0
- data/doc/examples/AllPairs.html +51 -0
- data/doc/examples/BinaryChop.html +89 -0
- data/doc/examples/CalculatorExample.html +108 -0
- data/doc/examples/ColumnIndex.html +43 -0
- data/doc/examples/ExampleTests.html +43 -0
- data/doc/examples/FitAcceptanceTests.html +53 -0
- data/doc/examples/GeoCoordinate.html +87 -0
- data/doc/examples/MusicExample.html +143 -0
- data/doc/examples/MusicExampleWithErrors.html +128 -0
- data/doc/examples/NetworkExample.html +47 -0
- data/doc/examples/WebPageExample.html +92 -0
- data/doc/examples/arithmetic.html +211 -0
- data/doc/examples/files/hp35bk.jpg +0 -0
- data/doc/examples/logo.gif +0 -0
- data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.FixtureParameters.html +81 -0
- data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.GracefulFixtureNames.html +87 -0
- data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.GracefulMemberNames.html +73 -0
- data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.ImportFixture.html +61 -0
- data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.WaysToSpecifyaFixtureNamespace.html +81 -0
- data/doc/spec/annotation.html +3833 -0
- data/doc/spec/extensions.html +302 -0
- data/doc/spec/fixtures.html +5181 -0
- data/doc/spec/index.html +947 -0
- data/doc/spec/parse.html +3094 -0
- data/lib/eg/all_combinations.rb +44 -0
- data/lib/eg/all_files.rb +94 -0
- data/lib/eg/all_pairs.rb +172 -0
- data/lib/eg/arithmetic_column_fixture.rb +35 -0
- data/lib/eg/arithmetic_fixture.rb +29 -0
- data/lib/eg/binary_chop.rb +100 -0
- data/lib/eg/calculator.rb +69 -0
- data/lib/eg/column_index.rb +85 -0
- data/lib/eg/division.rb +13 -0
- data/lib/eg/echo_args_fixture.rb +9 -0
- data/lib/eg/example_tests.rb +84 -0
- data/lib/eg/music/Music.txt +38 -0
- data/lib/eg/music/browser.rb +60 -0
- data/lib/eg/music/display.rb +24 -0
- data/lib/eg/music/music.rb +67 -0
- data/lib/eg/music/music_library.rb +70 -0
- data/lib/eg/music/music_player.rb +77 -0
- data/lib/eg/music/realtime.rb +39 -0
- data/lib/eg/music/simulator.rb +81 -0
- data/lib/eg/nested/bob.rb +12 -0
- data/lib/eg/nested/bob_the_builder_fixture.rb +11 -0
- data/lib/eg/net/simulator.rb +69 -0
- data/lib/eg/page.rb +91 -0
- data/lib/eg/sqrt.rb +19 -0
- data/lib/fat/annotation_fixture.rb +83 -0
- data/lib/fat/color.rb +45 -0
- data/lib/fat/divide.rb +13 -0
- data/lib/fat/document_parse_fixture.rb +67 -0
- data/lib/fat/equals.rb +59 -0
- data/lib/fat/fixture_name_fixture.rb +67 -0
- data/lib/fat/html_to_text_fixture.rb +20 -0
- data/lib/fat/money.rb +18 -0
- data/lib/fat/output_fixture.rb +32 -0
- data/lib/fat/parse_fixture.rb +92 -0
- data/lib/fat/reference_fixture.rb +31 -0
- data/lib/fat/standard_annotation_fixture.rb +58 -0
- data/lib/fat/string_writer.rb +12 -0
- data/lib/fat/table.rb +23 -0
- data/lib/fat/table_parse_fixture.rb +33 -0
- data/lib/fat/text_to_html_fixture.rb +21 -0
- data/lib/fit/action_fixture.rb +65 -0
- data/lib/fit/column_fixture.rb +104 -0
- data/lib/fit/file_runner.rb +80 -0
- data/lib/fit/fit_protocol.rb +62 -0
- data/lib/fit/fit_server.rb +173 -0
- data/lib/fit/fixture.rb +309 -0
- data/lib/fit/fixture_loader.rb +75 -0
- data/lib/fit/import_fixture.rb +9 -0
- data/lib/fit/parse.rb +206 -0
- data/lib/fit/primitive_fixture.rb +52 -0
- data/lib/fit/row_fixture.rb +188 -0
- data/lib/fit/scientific_double.rb +70 -0
- data/lib/fit/summary.rb +46 -0
- data/lib/fit/timed_action_fixture.rb +35 -0
- data/lib/fit/type_adapter.rb +95 -0
- data/lib/fit/wiki_runner.rb +15 -0
- data/lib/fittask.rb +184 -0
- data/test/all_tests.rb +13 -0
- data/test/file_runner_test.rb +52 -0
- data/test/fit_server_test.rb +214 -0
- data/test/fixture_loader_test.rb +71 -0
- data/test/fixture_test.rb +41 -0
- data/test/fixtures/fail_fixture.rb +9 -0
- data/test/fixtures/pass_fixture.rb +9 -0
- data/test/framework_test.rb +51 -0
- data/test/parse_test.rb +101 -0
- data/test/row_fixture_test.rb +44 -0
- data/test/scientific_double_test.rb +35 -0
- data/test/type_adapter_test.rb +120 -0
- metadata +165 -0
data/lib/eg/page.rb
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
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 'fit/parse'
|
|
5
|
+
require 'fit/row_fixture'
|
|
6
|
+
|
|
7
|
+
require 'open-uri'
|
|
8
|
+
require 'uri'
|
|
9
|
+
|
|
10
|
+
module Eg
|
|
11
|
+
|
|
12
|
+
class Page < Fit::RowFixture
|
|
13
|
+
|
|
14
|
+
@@url = nil
|
|
15
|
+
@@text = ''
|
|
16
|
+
|
|
17
|
+
# Actions
|
|
18
|
+
|
|
19
|
+
def location url
|
|
20
|
+
@@url = URI.parse url
|
|
21
|
+
@@text = open(@@url) {|stream| stream.read}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def title
|
|
25
|
+
Fit::Parse.new(@@text, ['title']).text
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def link label
|
|
29
|
+
links = Fit::Parse.new @@text, ['a']
|
|
30
|
+
until links.text =~ /^#{label}/
|
|
31
|
+
links = links.more
|
|
32
|
+
end
|
|
33
|
+
links.tag =~ /href\s*=\s*"(.*)"\s*>?/i
|
|
34
|
+
if $1.nil?
|
|
35
|
+
links.tag =~ /href\s*=\s*(.*)\s*>/i
|
|
36
|
+
end
|
|
37
|
+
link = $1
|
|
38
|
+
if link =~ /^(http:)?\/\//
|
|
39
|
+
@@url = URI.parse($1.nil? ? "http:#{link}" : link)
|
|
40
|
+
else
|
|
41
|
+
@@url = URI.parse(context(@@url) + link)
|
|
42
|
+
end
|
|
43
|
+
@@text = open(@@url) {|stream| stream.read}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def context url
|
|
47
|
+
u = "#{url.scheme}://#{url.host}"
|
|
48
|
+
u += (url.port == 80 ? '' : ":#{url.port}") + '/'
|
|
49
|
+
u
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Rows
|
|
53
|
+
|
|
54
|
+
def query
|
|
55
|
+
tags = ['wiki', 'table', 'tr', 'td']
|
|
56
|
+
rows = Fit::Parse.new(@@text, tags).at(0, 0, 2)
|
|
57
|
+
result = [nil] * rows.size
|
|
58
|
+
0.upto(rows.size - 1) do |i|
|
|
59
|
+
result[i] = Row.new rows
|
|
60
|
+
rows = rows.more
|
|
61
|
+
end
|
|
62
|
+
result
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Utility
|
|
66
|
+
|
|
67
|
+
def get url
|
|
68
|
+
response = Net::HTTP.get_response url
|
|
69
|
+
response.body
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
class Row
|
|
73
|
+
attr_accessor :cells
|
|
74
|
+
def initialize row
|
|
75
|
+
@cells = row.parts
|
|
76
|
+
end
|
|
77
|
+
def numerator; to_number(@cells.at(0).text); end
|
|
78
|
+
def denominator; to_number(@cells.at(1).text); end
|
|
79
|
+
# An hack to get the right type of number
|
|
80
|
+
def to_number string
|
|
81
|
+
begin
|
|
82
|
+
return Integer(string)
|
|
83
|
+
rescue
|
|
84
|
+
return Float(string)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end
|
data/lib/eg/sqrt.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
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 'fit/column_fixture'
|
|
5
|
+
|
|
6
|
+
module Eg
|
|
7
|
+
|
|
8
|
+
class Sqrt < Fit::ColumnFixture
|
|
9
|
+
attr_accessor :value
|
|
10
|
+
def sqrt
|
|
11
|
+
# But Math.sqrt already raise an error if its parameter is less than zero...
|
|
12
|
+
# and in fact this guard clause is present because the java.lang.Math method
|
|
13
|
+
# for sqare radix would return NaN if its argument is negative.
|
|
14
|
+
raise "negative sqrt" if @value < 0
|
|
15
|
+
Math.sqrt @value
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
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 'fat/string_writer'
|
|
5
|
+
require 'fit/column_fixture'
|
|
6
|
+
|
|
7
|
+
module Fat
|
|
8
|
+
|
|
9
|
+
class AnnotationFixture < Fit::ColumnFixture
|
|
10
|
+
|
|
11
|
+
attr_accessor :original_html, :row, :column,
|
|
12
|
+
:overwrite_cell_body, :add_to_cell_body,
|
|
13
|
+
:overwrite_cell_tag, :overwrite_end_cell_tag, :add_to_cell_tag,
|
|
14
|
+
:overwrite_row_tag, :overwrite_end_row_tag, :add_to_row_tag,
|
|
15
|
+
:overwrite_table_tag, :overwrite_end_table_tag, :add_to_table_tag,
|
|
16
|
+
:add_cell_following, :remove_following_cell,
|
|
17
|
+
:add_row_following, :remove_following_row,
|
|
18
|
+
:add_table_following
|
|
19
|
+
|
|
20
|
+
def initialize
|
|
21
|
+
super
|
|
22
|
+
@row = @column = 0
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def resulting_html
|
|
26
|
+
table = Fit::Parse.new original_html
|
|
27
|
+
row = table.at 0, @row - 1
|
|
28
|
+
cell = row.at 0, @column - 1
|
|
29
|
+
|
|
30
|
+
cell.body = @overwrite_cell_body unless @overwrite_cell_body.nil?
|
|
31
|
+
cell.add_to_body(@add_to_cell_body) unless @add_to_cell_body.nil?
|
|
32
|
+
|
|
33
|
+
cell.tag = @overwrite_cell_tag unless @overwrite_cell_tag.nil?
|
|
34
|
+
cell.end = @overwrite_end_cell_tag unless @overwrite_end_cell_tag.nil?
|
|
35
|
+
cell.add_to_tag(strip_delimiters(@add_to_cell_tag)) unless @add_to_cell_tag.nil?
|
|
36
|
+
|
|
37
|
+
row.tag = @overwrite_row_tag unless @overwrite_row_tag.nil?
|
|
38
|
+
row.end = @overwrite_end_row_tag unless @overwrite_end_row_tag.nil?
|
|
39
|
+
row.add_to_tag(strip_delimiters(@add_to_row_tag)) unless @add_to_row_tag.nil?
|
|
40
|
+
|
|
41
|
+
table.tag = @overwrite_table_tag unless @overwrite_table_tag.nil?
|
|
42
|
+
table.end = @overwrite_end_table_tag unless @overwrite_end_table_tag.nil?
|
|
43
|
+
table.add_to_tag(strip_delimiters(@add_to_table_tag)) unless @add_to_table_tag.nil?
|
|
44
|
+
|
|
45
|
+
add_parse(cell, @add_cell_following, ['td']) unless @add_cell_following.nil?
|
|
46
|
+
remove_parse(cell) unless @remove_following_cell.nil?
|
|
47
|
+
|
|
48
|
+
add_parse(row, @add_row_following, ['tr', 'td']) unless @add_row_following.nil?
|
|
49
|
+
remove_parse(row) unless @remove_following_row.nil?
|
|
50
|
+
|
|
51
|
+
add_parse(table, @add_table_following, ['table', 'tr', 'td']) unless @add_table_following.nil?
|
|
52
|
+
|
|
53
|
+
generate_output table
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def add_parse parse, new_string, tags
|
|
57
|
+
new_parse = Fit::Parse.new new_string, tags
|
|
58
|
+
new_parse.more = parse.more
|
|
59
|
+
new_parse.trailer = parse.trailer
|
|
60
|
+
parse.more = new_parse
|
|
61
|
+
parse.trailer = nil
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def remove_parse parse
|
|
65
|
+
parse.trailer = parse.more.trailer
|
|
66
|
+
parse.more = parse.more.more
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def strip_delimiters string
|
|
70
|
+
string.gsub(/^\[/, '').gsub(/\]$/, '')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Code smell note: copied from Fat::ParseFixture
|
|
74
|
+
def generate_output parse
|
|
75
|
+
result = StringWriter.new
|
|
76
|
+
parse.print result
|
|
77
|
+
result.to_s.strip
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private :generate_output
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
data/lib/fat/color.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
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 'fit/primitive_fixture'
|
|
5
|
+
require 'fat/table'
|
|
6
|
+
|
|
7
|
+
module Fat
|
|
8
|
+
|
|
9
|
+
class Color < Fit::PrimitiveFixture
|
|
10
|
+
def do_rows rows
|
|
11
|
+
@actual_row = Table.table.parts
|
|
12
|
+
raise "wrong size table" if not rows.size == @actual_row.size
|
|
13
|
+
super
|
|
14
|
+
end
|
|
15
|
+
def do_row row
|
|
16
|
+
super
|
|
17
|
+
@actual_row = @actual_row.more
|
|
18
|
+
end
|
|
19
|
+
def do_cell cell, column_index
|
|
20
|
+
check_value cell, color(@actual_row.parts.at(column_index))
|
|
21
|
+
end
|
|
22
|
+
def color cell
|
|
23
|
+
b = extract cell.tag, 'bgcolor="', 'white'
|
|
24
|
+
f = extract cell.body, '<font color="', 'black'
|
|
25
|
+
f == 'black' ? b : "#{f}/#{b}"
|
|
26
|
+
end
|
|
27
|
+
def extract text, pattern, default_color
|
|
28
|
+
index = text.index pattern
|
|
29
|
+
return default_color if index.nil?
|
|
30
|
+
index += pattern.size
|
|
31
|
+
decode text[index..(index + 6)]
|
|
32
|
+
end
|
|
33
|
+
def decode code
|
|
34
|
+
case code
|
|
35
|
+
when Fit::Fixture::RED then 'red'
|
|
36
|
+
when Fit::Fixture::GREEN then 'green'
|
|
37
|
+
when Fit::Fixture::YELLOW then 'yellow'
|
|
38
|
+
when Fit::Fixture::GRAY then 'gray'
|
|
39
|
+
when '#808080' then 'gray'
|
|
40
|
+
else code
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
data/lib/fat/divide.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
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 'fit/column_fixture'
|
|
5
|
+
|
|
6
|
+
module Fat
|
|
7
|
+
|
|
8
|
+
class Divide < Fit::ColumnFixture
|
|
9
|
+
attr_accessor :x, :y
|
|
10
|
+
def divide; x / y; end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
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 'fit/column_fixture'
|
|
5
|
+
require 'fat/string_writer'
|
|
6
|
+
|
|
7
|
+
module Fat
|
|
8
|
+
|
|
9
|
+
class DocumentParseFixture < Fit::ColumnFixture
|
|
10
|
+
attr_accessor :html
|
|
11
|
+
attr_accessor :note # non-functional
|
|
12
|
+
|
|
13
|
+
def output
|
|
14
|
+
generate_output(Fit::Parse.new(@html))
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def structure
|
|
18
|
+
dump_tables(Fit::Parse.new(@html))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def dump_tables(table)
|
|
22
|
+
result = ""
|
|
23
|
+
separator = ""
|
|
24
|
+
while (table)
|
|
25
|
+
result += separator
|
|
26
|
+
result += dump_rows(table.parts)
|
|
27
|
+
separator = "\n----\n"
|
|
28
|
+
table = table.more
|
|
29
|
+
end
|
|
30
|
+
result
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def dump_rows(row)
|
|
34
|
+
result = ""
|
|
35
|
+
separator = ""
|
|
36
|
+
while (row)
|
|
37
|
+
result += separator
|
|
38
|
+
result += dump_cells(row.parts)
|
|
39
|
+
separator = "\n"
|
|
40
|
+
row = row.more
|
|
41
|
+
end
|
|
42
|
+
result
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def dump_cells(cell)
|
|
46
|
+
result = ""
|
|
47
|
+
separator = ""
|
|
48
|
+
while (cell)
|
|
49
|
+
result += separator
|
|
50
|
+
result += "[" + cell.body + "]"
|
|
51
|
+
separator = " "
|
|
52
|
+
cell = cell.more
|
|
53
|
+
end
|
|
54
|
+
result
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def generate_output parse
|
|
58
|
+
result = StringWriter.new
|
|
59
|
+
parse.print result
|
|
60
|
+
result.to_s
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private :dump_tables, :dump_rows, :dump_cells, :generate_output
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
data/lib/fat/equals.rb
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
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 'fit/primitive_fixture'
|
|
5
|
+
require 'fit/scientific_double'
|
|
6
|
+
require 'fit/type_adapter'
|
|
7
|
+
|
|
8
|
+
require 'fat/money'
|
|
9
|
+
|
|
10
|
+
module Fat
|
|
11
|
+
|
|
12
|
+
class Equals < Fit::PrimitiveFixture
|
|
13
|
+
|
|
14
|
+
attr_accessor :heads, :adapter, :x, :y
|
|
15
|
+
|
|
16
|
+
def do_rows rows
|
|
17
|
+
@heads = rows.parts
|
|
18
|
+
super rows.more
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def do_cell cell, column_index
|
|
22
|
+
begin
|
|
23
|
+
head = @heads.at(column_index).text[0..0]
|
|
24
|
+
case head
|
|
25
|
+
when 't' then @adapter = type(cell.text)
|
|
26
|
+
when 'x' then @x = @adapter.parse(cell.text)
|
|
27
|
+
when 'y' then @y = @adapter.parse(cell.text)
|
|
28
|
+
when '=' then check_boolean(cell, @adapter.equals(@x, @y))
|
|
29
|
+
when '?' then cell.add_to_body(Fit::Fixture.gray("x: #{print(@x)} y: #{print(@y)}"))
|
|
30
|
+
else raise "Don't do #{head}"
|
|
31
|
+
end
|
|
32
|
+
rescue Exception => e
|
|
33
|
+
exception cell, e
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def type name;
|
|
38
|
+
case name
|
|
39
|
+
when 'date' then Fit::TypeAdapter.on(self, ParseDate)
|
|
40
|
+
when 'integer' then Fit::TypeAdapter.on(self, Integer)
|
|
41
|
+
when 'real' then Fit::TypeAdapter.on(self, Float)
|
|
42
|
+
when 'scientific' then Fit::TypeAdapter.on(self, Fit::ScientificDouble)
|
|
43
|
+
when 'money' then Fit::TypeAdapter.on(self, Money)
|
|
44
|
+
else Fit::TypeAdapter.for(self, '', false)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def parse string, klass
|
|
49
|
+
return Money.new(string) if klass == Money
|
|
50
|
+
return Float(string) if klass == Float
|
|
51
|
+
return Integer(string) if klass == Integer
|
|
52
|
+
super
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def print value; @adapter.to_s value; end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
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 'fit/column_fixture'
|
|
5
|
+
|
|
6
|
+
module Fat
|
|
7
|
+
|
|
8
|
+
class FixtureNameFixture < Fit::ColumnFixture
|
|
9
|
+
attr_accessor :table
|
|
10
|
+
def fixture_name
|
|
11
|
+
table_parse = generate_table_parse(@table)
|
|
12
|
+
dump_tables generate_table_parse(@table)
|
|
13
|
+
end
|
|
14
|
+
def dump_tables table
|
|
15
|
+
result = ''
|
|
16
|
+
separator = ''
|
|
17
|
+
until table.nil?
|
|
18
|
+
result += separator
|
|
19
|
+
result += dump_rows table.parts
|
|
20
|
+
separator = "\n----\n"
|
|
21
|
+
table = table.more
|
|
22
|
+
end
|
|
23
|
+
result
|
|
24
|
+
end
|
|
25
|
+
def dump_rows row
|
|
26
|
+
result = ''
|
|
27
|
+
separator = ''
|
|
28
|
+
until row.nil?
|
|
29
|
+
result += separator
|
|
30
|
+
result += dump_cells row.parts
|
|
31
|
+
separator = "\n"
|
|
32
|
+
row = row.more
|
|
33
|
+
end
|
|
34
|
+
result
|
|
35
|
+
end
|
|
36
|
+
def dump_cells cell
|
|
37
|
+
result = ''
|
|
38
|
+
separator = ''
|
|
39
|
+
until cell.nil?
|
|
40
|
+
result += separator
|
|
41
|
+
result += "[#{cell.text}]"
|
|
42
|
+
separator = ' '
|
|
43
|
+
cell = cell.more
|
|
44
|
+
end
|
|
45
|
+
result
|
|
46
|
+
end
|
|
47
|
+
def valid_fixture; 'not implemented'; end
|
|
48
|
+
def error; 'not implemented'; end
|
|
49
|
+
def generate_table_parse table
|
|
50
|
+
rows = table.split(/\n/)
|
|
51
|
+
Fit::ParseHolder.create 'table', nil, generate_row_parses(rows, 0), nil
|
|
52
|
+
end
|
|
53
|
+
def generate_row_parses rows, row_index
|
|
54
|
+
return nil if row_index >= rows.size
|
|
55
|
+
md = /\[(.*?)\]/.match(rows[row_index])
|
|
56
|
+
cells = md[1..-1]
|
|
57
|
+
Fit::ParseHolder.create 'tr', nil, generate_cell_parses(cells, 0), generate_row_parses(rows, row_index + 1)
|
|
58
|
+
end
|
|
59
|
+
def generate_cell_parses cells, cell_index
|
|
60
|
+
return nil if cell_index >= cells.size
|
|
61
|
+
Fit::ParseHolder.create 'td', cells[cell_index], nil, generate_cell_parses(cells, cell_index + 1)
|
|
62
|
+
end
|
|
63
|
+
private :dump_tables, :dump_rows, :dump_cells
|
|
64
|
+
private :generate_table_parse, :generate_row_parses, :generate_cell_parses
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
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 'fit/column_fixture'
|
|
5
|
+
|
|
6
|
+
module Fat
|
|
7
|
+
|
|
8
|
+
class HtmlToTextFixture < Fit::ColumnFixture
|
|
9
|
+
@@metadata = {'html' => String}
|
|
10
|
+
attr_writer :html
|
|
11
|
+
def text
|
|
12
|
+
html = @html.gsub(/\\u00a0/, "\240")
|
|
13
|
+
escape_ascii(Fit::Parse.html_to_text(html))
|
|
14
|
+
end
|
|
15
|
+
def escape_ascii text
|
|
16
|
+
text.gsub("\x0a", "\\n").gsub("\x0d", "\\r").gsub("\xa0", " ")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
data/lib/fat/money.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Copyright (c) 2002 Cunningham & Cunningham, Inc.
|
|
2
|
+
# Released under the terms of the GNU General Public License version 2 or later.
|
|
3
|
+
|
|
4
|
+
module Fat
|
|
5
|
+
|
|
6
|
+
class Money
|
|
7
|
+
attr_accessor :cents
|
|
8
|
+
def initialize string
|
|
9
|
+
stripped = ''
|
|
10
|
+
string.each {|char| stripped += char if char.between?('0', '9') or char == '.'}
|
|
11
|
+
@cents = (100 * stripped.to_f).to_i
|
|
12
|
+
end
|
|
13
|
+
def == money
|
|
14
|
+
@cents == money.cents
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
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 'fit/column_fixture'
|
|
5
|
+
|
|
6
|
+
module Fat
|
|
7
|
+
|
|
8
|
+
class OutputFixture < Fit::ColumnFixture
|
|
9
|
+
attr_accessor :text
|
|
10
|
+
def cell_output
|
|
11
|
+
cell = Fit::ParseHolder.create 'td', '', nil, nil
|
|
12
|
+
cell.leader = ''
|
|
13
|
+
cell.body = Fit::Fixture.escape unescape(@text)
|
|
14
|
+
generate_output cell
|
|
15
|
+
end
|
|
16
|
+
def unescape text
|
|
17
|
+
text.gsub(/\\n/, "\n").gsub(/\\r/, "\r")
|
|
18
|
+
end
|
|
19
|
+
def generate_output parse
|
|
20
|
+
result = StringWriter.new
|
|
21
|
+
parse.print result
|
|
22
|
+
result.to_s
|
|
23
|
+
end
|
|
24
|
+
private :unescape, :generate_output
|
|
25
|
+
class StringWriter
|
|
26
|
+
def initialize; @s = ''; end
|
|
27
|
+
def print s; @s += s; end
|
|
28
|
+
def to_s; @s; end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
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 'fat/string_writer'
|
|
5
|
+
require 'fit/column_fixture'
|
|
6
|
+
|
|
7
|
+
module Fat
|
|
8
|
+
|
|
9
|
+
# A fixture to discuss parsing specification.
|
|
10
|
+
class ParseFixture < Fit::ColumnFixture
|
|
11
|
+
|
|
12
|
+
attr_accessor :html, :table_cell, :entity
|
|
13
|
+
attr_accessor :note # unused
|
|
14
|
+
|
|
15
|
+
def generate_parse
|
|
16
|
+
input_columns = 0
|
|
17
|
+
html = nil
|
|
18
|
+
unless @html.nil?
|
|
19
|
+
input_columns += 1
|
|
20
|
+
html = @html
|
|
21
|
+
end
|
|
22
|
+
unless @table_cell.nil?
|
|
23
|
+
input_columns += 1
|
|
24
|
+
html = "<table><tr>#@table_cell</tr></table>"
|
|
25
|
+
end
|
|
26
|
+
unless @entity.nil?
|
|
27
|
+
input_columns += 1
|
|
28
|
+
html = "<table><tr><td>#@entity</td></tr></table>"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
raise "Exactly ONE of the following columns is needed: 'Html', 'TableCell', or 'Entity'" if input_columns != 1
|
|
32
|
+
|
|
33
|
+
html.gsub!(/\\u00a0/, "\240")
|
|
34
|
+
Fit::Parse.new html
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def output; generate_output(generate_parse); end
|
|
38
|
+
|
|
39
|
+
def generate_output parse
|
|
40
|
+
result = StringWriter.new
|
|
41
|
+
parse.print result
|
|
42
|
+
result.to_s
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def parse; dump_tables(generate_parse); end
|
|
46
|
+
|
|
47
|
+
def dump_tables table
|
|
48
|
+
result = ''
|
|
49
|
+
separator = ''
|
|
50
|
+
until table.nil?
|
|
51
|
+
result += separator
|
|
52
|
+
result += dump_rows(table.parts)
|
|
53
|
+
separator = "\n----\n"
|
|
54
|
+
table = table.more
|
|
55
|
+
end
|
|
56
|
+
result
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def dump_rows row
|
|
60
|
+
result = ''
|
|
61
|
+
separator = ''
|
|
62
|
+
until row.nil?
|
|
63
|
+
result += separator
|
|
64
|
+
result += dump_cells(row.parts)
|
|
65
|
+
separator = "\n"
|
|
66
|
+
row = row.more
|
|
67
|
+
end
|
|
68
|
+
result
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def dump_cells cell
|
|
72
|
+
result = ''
|
|
73
|
+
separator = ''
|
|
74
|
+
until cell.nil?
|
|
75
|
+
result += separator
|
|
76
|
+
result += "[#{escape_ascii(cell.text)}]"
|
|
77
|
+
separator = ' '
|
|
78
|
+
cell = cell.more
|
|
79
|
+
end
|
|
80
|
+
result
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def escape_ascii text
|
|
84
|
+
text.gsub("\x0a", "\\n").gsub("\x0d", "\\r").gsub("\xa0", " ")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private :generate_parse, :generate_output
|
|
88
|
+
private :dump_tables, :dump_rows, :dump_cells, :escape_ascii
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
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 'fit/column_fixture'
|
|
5
|
+
|
|
6
|
+
module Fat
|
|
7
|
+
|
|
8
|
+
class ReferenceFixture < Fit::ColumnFixture
|
|
9
|
+
attr_accessor :description, :location
|
|
10
|
+
def result
|
|
11
|
+
input_name = "spec/#@location"
|
|
12
|
+
output_name = "spec/results_#@location"
|
|
13
|
+
begin
|
|
14
|
+
runner = Fit::FileRunner.new
|
|
15
|
+
runner.process_args [input_name, output_name]
|
|
16
|
+
runner.process
|
|
17
|
+
runner.output.close
|
|
18
|
+
|
|
19
|
+
counts = runner.fixture.counts
|
|
20
|
+
if counts.total_errors.zero?
|
|
21
|
+
return 'pass'
|
|
22
|
+
else
|
|
23
|
+
return "fail: #{counts.to_s}"
|
|
24
|
+
end
|
|
25
|
+
rescue Exception => e
|
|
26
|
+
return "file not found: #{input_name}"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|