fit 1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|