rcor 0.8.1 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/Rakefile.rb +1 -1
  2. data/lib/concordion.rb +1 -8
  3. data/lib/concordion_constants.rb +1 -1
  4. data/lib/concordion_css.rb +8 -1
  5. data/lib/concordion_css_decorator.rb +21 -4
  6. data/lib/concordion_error_condition.rb +26 -0
  7. data/lib/concordion_invoker.rb +103 -9
  8. data/lib/concordion_parse_result.rb +19 -1
  9. data/lib/concordion_parser.rb +1 -1
  10. data/lib/concordion_processor.rb +3 -2
  11. data/lib/concordion_string_utility.rb +36 -2
  12. data/lib/concordion_test_case.rb +12 -62
  13. data/lib/concordion_test_methods.rb +127 -0
  14. data/lib/concordion_utility.rb +15 -3
  15. data/lib/goldmaster_test_case.rb +22 -5
  16. data/lib/loader_helper.rb +16 -0
  17. data/nbproject/private/private.xml +0 -6
  18. data/nbproject/private/rake-d.txt +13 -0
  19. data/tests/apostrophe.html +7 -0
  20. data/tests/apostrophe_test.rb +18 -0
  21. data/tests/ariel_example.html +13 -0
  22. data/tests/ariel_example_test.rb +36 -0
  23. data/tests/attr_assert.html +2 -0
  24. data/tests/basic_assert_true_test.rb +5 -1
  25. data/tests/basic_set.html +3 -0
  26. data/tests/basic_text.html +8 -0
  27. data/tests/basic_text_test.rb +11 -0
  28. data/tests/concordion_parse_result_test.rb +16 -1
  29. data/tests/concordion_test.rb +0 -14
  30. data/tests/concordion_utility_test.rb +44 -0
  31. data/tests/failing.html +4 -0
  32. data/tests/failing_test.rb +10 -2
  33. data/tests/goldmaster_assert_true_failing.html +5 -0
  34. data/tests/goldmaster_assert_true_failing_goldmaster.html +169 -0
  35. data/tests/goldmaster_assert_true_failing_test.rb +14 -0
  36. data/tests/goldmaster_failing.html +40 -0
  37. data/tests/goldmaster_failing_goldmaster.html +48 -1
  38. data/tests/goldmaster_failing_test.rb +28 -2
  39. data/tests/goldmaster_malformed.html +7 -0
  40. data/tests/goldmaster_malformed_goldmaster.html +171 -0
  41. data/tests/goldmaster_malformed_test.rb +11 -0
  42. data/tests/goldmaster_passing_goldmaster.html +8 -1
  43. data/tests/goldmaster_table_bug.html +12 -0
  44. data/tests/goldmaster_table_bug_goldmaster.html +176 -0
  45. data/tests/goldmaster_table_bug_test.rb +24 -0
  46. data/tests/goldmaster_table_goldmaster.html +8 -1
  47. data/tests/image.html +5 -0
  48. data/tests/image.jpg +0 -0
  49. data/tests/image_test.rb +9 -0
  50. data/tests/mixed.html +5 -0
  51. data/tests/mixed_test.rb +19 -0
  52. data/tests/no_parens.html +15 -0
  53. data/tests/no_parens_test.rb +20 -0
  54. data/tests/numbers.html +5 -0
  55. data/tests/numbers_test.rb +11 -0
  56. data/tests/verify_rows_scsr_test.rb +2 -0
  57. data/tests/verify_rows_simple.html +14 -0
  58. data/tests/verify_rows_simple_test.rb +17 -0
  59. metadata +31 -4
  60. data/lib/concordion_invocation_string_builder.rb +0 -24
@@ -0,0 +1,127 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+ require 'concordion_utility'
4
+ require 'concordion_reader'
5
+ require 'concordion_parser'
6
+ require 'concordion_processor'
7
+ require 'concordion_parse_result'
8
+ require 'concordion_test_case'
9
+ require 'concordion_writer'
10
+ require 'concordion_environment'
11
+ require 'concordion'
12
+ require 'concordion_css_decorator'
13
+ require 'concordion_utility'
14
+
15
+
16
+ module ConcordionConfigMethods
17
+
18
+
19
+ def default_config
20
+ concordion = Concordion.new
21
+ parser = ConcordionParser.new(ConcordionReader.new, concordion)
22
+ decorator = ConcordionCSSDecorator.new
23
+ processor = ConcordionProcessor.new(concordion, decorator)
24
+ {
25
+ :parser => parser,
26
+ :writer => ConcordionWriter.new(ConcordionEnvironment.output_dir),
27
+ :concordion => concordion,
28
+ :decorator => decorator,
29
+ :processor => processor,
30
+ :write_goldmaster => false,
31
+ :css_type => ConcordionEnvironment.css_type
32
+ }
33
+ end
34
+
35
+ def bind_test_method_to(subclass, config)
36
+ subclass.class_eval do
37
+ define_method :test_spec do
38
+ filename = snake_cased_test_name(subclass.to_s)
39
+ parse_spec(filename,config)
40
+ failures = run_spec(filename, config)
41
+ report_spec(filename,config, failures)
42
+ end
43
+ end
44
+ subclass
45
+ end
46
+
47
+
48
+ end
49
+
50
+ module ConcordionInternalTestMethods
51
+ @@EXPECTED_FAILURE_COUNT = 0
52
+ include ConcordionUtility
53
+
54
+ def parse_spec(filename,config)
55
+ config[:parser].parse(filename)
56
+ assert_concordion_document(config)
57
+ config[:decorator].add_concordion_css_link(config[:parser].root, config[:parser].html, config[:css_type])
58
+ end
59
+
60
+ def run_spec(filename, config)
61
+ failures = []
62
+ config[:parser].each_eligible_concordion_element do |elem|
63
+ failure = config[:processor].process(elem, self)
64
+ failures << failure unless failure.nil?
65
+ end
66
+ failures
67
+ end
68
+
69
+ def report_spec(filename, config, failures)
70
+ config[:decorator].add_css_file_to_output_dir(config[:writer], config[:css_type])
71
+
72
+ writer = config[:writer]
73
+ if self.class.method_defined?(:rcor_writer)
74
+ writer = rcor_writer()
75
+ end
76
+
77
+ outfilename = writer.calculate_filename_and_overwrite(config[:parser].root, filename)
78
+ assert_no_failures(outfilename, config, failures)
79
+ end
80
+
81
+ def assert_no_failures(outfilename, config, failures)
82
+ expected = @@EXPECTED_FAILURE_COUNT
83
+
84
+ if self.class.method_defined?(:expected_failure_count)
85
+ expected = expected_failure_count()
86
+ end
87
+
88
+ message = build_message "#{show_failures(failures)}\nWrote output to #{outfilename}.",
89
+ 'Actual failure count <?> did not match expected <?>.',
90
+ failures.size, expected
91
+ assert_block message do
92
+ failures.size == expected
93
+ end
94
+ end
95
+
96
+ def show_failures(failures)
97
+ rv = ""
98
+ failures.each_with_index do |failure, index|
99
+ rv += "[Error:#{index + 1}] #{failure}\n"
100
+ end
101
+ rv
102
+ end
103
+
104
+ def assert_concordion_document(config)
105
+ assert_equal "http://www.concordion.org/2007/concordion", config[:parser].html.get_attribute("xmlns:concordion")
106
+ end
107
+
108
+ end
109
+
110
+ module ConcordionTestMethods
111
+ include ConcordionInternalTestMethods
112
+ extend ConcordionConfigMethods
113
+
114
+ class << self
115
+ alias_method :original_included, :included
116
+ end
117
+
118
+ def self.included(cmod)
119
+ original_included(cmod)
120
+ conf = default_config
121
+ cm = class << cmod
122
+ include ConcordionConfigMethods
123
+ end
124
+
125
+ bind_test_method_to(cmod, conf)
126
+ end
127
+ end
@@ -25,9 +25,21 @@ module ConcordionUtility
25
25
 
26
26
  def concordion_arguments(name)
27
27
  return [] unless has_arguments?(name)
28
- name_no_end_paren = name.gsub(")", '')
29
- arg_string = name_no_end_paren.split("(")[1]
30
-
28
+ arg_string = nil
29
+ if name =~ /\(/
30
+ name_no_end_paren = name.gsub(")", '')
31
+ arg_string = name_no_end_paren.split("(")[1]
32
+ else
33
+
34
+ base = name.strip
35
+ if base =~ /=/
36
+ arg_string = nil
37
+ base = base.split("=")[1].strip
38
+ end
39
+ tokens = base.split(" ").compact
40
+ arg_string = tokens.slice(1, tokens.size - 1).join(" ")
41
+ end
42
+
31
43
  arg_string.split(",").collect { |arg| arg.strip }
32
44
  end
33
45
  def concordion_variable_name(conc_call)
@@ -1,32 +1,49 @@
1
1
  require 'concordion_test_case'
2
2
  require 'concordion_string_writer'
3
+
4
+ require 'diff/lcs'
5
+
3
6
  class GoldmasterTestCase < ConcordionTestCase
4
7
 
5
8
 
6
9
  def initialize(suite, conf = {})
7
10
  @writer = ConcordionStringWriter.new
8
11
 
9
- config = ConcordionTestCase.default_config.merge({:writer => @writer}).merge(conf)
12
+ config = ConcordionTestCase.default_config.merge(conf)
10
13
  @write_goldmaster = config[:write_goldmaster]
11
14
  super(suite, config)
12
15
  end
13
16
 
17
+ def rcor_writer
18
+ @writer
19
+ end
14
20
  def test_spec
15
21
  trivial
16
22
  end
17
23
 
18
24
 
19
25
  def teardown
20
- if @write_goldmaster
26
+ if self.class.method_defined?(:write_goldmaster!)
21
27
  ConcordionWriter.new.write(@writer.data, snake_cased_goldmaster_name(self.class.to_s))
22
28
 
23
- assert !@write_goldmaster, "Disable write to goldmaster"
29
+ assert false, "Disable write to goldmaster (erase write_goldmaster! in #{self.class})"
24
30
  end
25
-
31
+
26
32
  unless is_trivial?
27
33
  goldmaster = ConcordionReader.new.read(snake_cased_goldmaster_name(self.class.to_s))
28
- assert_equal @writer.data, goldmaster
34
+ assert @writer.data.size > 0
35
+
36
+ diffs = Diff::LCS.diff(@writer.data, goldmaster)
37
+ pos = diffs[0].entries[0].position
38
+ context_exp = goldmaster.slice(pos - 50, 100)
39
+ context_act = @writer.data.slice(pos - 50, 100)
40
+
41
+ assert_equal @writer.data, goldmaster, "First difference at #{pos} bytes into goldmaster:\n(#{context_exp}) goldmaster vs\n(#{context_act}) actual"
29
42
  end
30
43
 
31
44
  end
45
+
46
+ def meths(o)
47
+ (o.methods - Object.methods).sort
48
+ end
32
49
  end
@@ -0,0 +1,16 @@
1
+ #
2
+ # To change this template, choose Tools | Templates
3
+ # and open the template in the editor.
4
+
5
+
6
+ module LoaderHelper
7
+ def path_for(filename)
8
+ return filename if File.exists?(filename)
9
+
10
+ $LOAD_PATH.each do |path|
11
+ candidate = "#{path}/#{filename}"
12
+ return candidate if File.exists?(candidate)
13
+ end
14
+ throw Exception.new("could not find '#{filename}' on load path")
15
+ end
16
+ end
@@ -1,10 +1,4 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <project-private xmlns="http://www.netbeans.org/ns/project-private/1">
3
3
  <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
4
- <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/1">
5
- <file>file:/home/bg/src/rcor/rcor/trunk/Rakefile.rb</file>
6
- <file>file:/home/bg/src/rcor/rcor/trunk/lib/concordion_css_decorator.rb</file>
7
- <file>file:/home/bg/src/rcor/rcor/trunk/lib/concordion_environment.rb</file>
8
- <file>file:/home/bg/src/rcor/rcor/trunk/tests/concordion_environment_test.rb</file>
9
- </open-files>
10
4
  </project-private>
@@ -0,0 +1,13 @@
1
+ clean=Remove any temporary products.
2
+ clobber=Remove any generated file.
3
+ clobber_package=Remove package products
4
+ default=
5
+ gem=Build the gem file rcor-0.9.2.gem
6
+ package=Build all the packages
7
+ pkg=
8
+ pkg/rcor-0.9.2=
9
+ pkg/rcor-0.9.2.gem=
10
+ pkg/rcor-0.9.2.tgz=
11
+ pkg/rcor-0.9.2.zip=
12
+ repackage=Force a rebuild of the package files
13
+ test=Run tests
@@ -0,0 +1,7 @@
1
+ <html xmlns:concordion="http://www.concordion.org/2007/concordion">
2
+ <body>
3
+ <p concordion:assertEquals="apostrophe()">Apostrophe's</p>
4
+ <p concordion:assertEquals="as_apostrophe_bs()">As &#39; Bs</p>
5
+ <p concordion:assertEquals="check(#TEXT)">A's</p>
6
+ </body>
7
+ </html>
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+ require 'concordion_test_case'
3
+
4
+ class ApostropheTest < ConcordionTestCase
5
+
6
+ def apostrophe
7
+ "Apostrophe's"
8
+ end
9
+
10
+ def as_apostrophe_bs
11
+ "As ' Bs"
12
+ end
13
+
14
+ def check(text)
15
+ "A's"
16
+ end
17
+
18
+ end
@@ -0,0 +1,13 @@
1
+ <html xmlns:concordion="http://www.concordion.org/2007/concordion">
2
+ <body>
3
+ <p>Given an <span concordion:execute="#author = setup_user (#TEXT)">author</span>
4
+ who has an
5
+ <span concordion:execute="#entity = setup_entity(#author,#TEXT)">entity</span>
6
+ with no versions,
7
+ </p>
8
+ <p concordion:execute="delete_users_entity(#author,#entity)"
9
+ >When the author deletes the entity,</p>
10
+ <p concordion:assertTrue="is_deleted?(#entity)">Then entity is
11
+ deleted from the system.</p>
12
+ </body>
13
+ </html>
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+ require 'concordion_test_case'
3
+ require 'user'
4
+
5
+ class SomeEntity
6
+ attr_accessor :nombre, :deleted
7
+ def initialize(nombre)
8
+ @nombre = nombre
9
+ @deleted = false
10
+ end
11
+ end
12
+
13
+ class ArielExampleTest < ConcordionTestCase
14
+
15
+ def setup_user(name)
16
+ User.new(name, "whatever")
17
+ end
18
+
19
+ def setup_entity(user, entity_name)
20
+ entity = SomeEntity.new(entity_name)
21
+ user.other = entity
22
+
23
+ entity
24
+ end
25
+
26
+ def delete_users_entity(user, entity)
27
+ if user.other.nombre == entity.nombre
28
+ user.other.deleted = true
29
+ end
30
+ end
31
+
32
+ def is_deleted?(entity)
33
+ entity.deleted
34
+ end
35
+ end
36
+
@@ -1,5 +1,7 @@
1
1
  <html xmlns:concordion="http://www.concordion.org/2007/concordion">
2
2
  <body>
3
3
  <p concordion:assertEquals="greeting()">attribute based</p>
4
+ <p concordion:execute="greeting=(#TEXT)">updated</p>
5
+ <p concordion:assertEquals="greeting()">updated</p>
4
6
  </body>
5
7
  </html>
@@ -1,10 +1,14 @@
1
1
  # To change this template, choose Tools | Templates
2
2
  # and open the template in the editor.
3
-
3
+ require 'concordion_test_case'
4
4
  class BasicAssertTrueTest < ConcordionTestCase
5
5
  def initialize(suite)
6
6
  super(suite, {:expected_failure_count => 1})
7
7
  end
8
+ def expected_failure_count
9
+ 1
10
+ end
11
+
8
12
  def is_boiling_point(temperature)
9
13
  212 == temperature.to_i
10
14
  end
@@ -2,6 +2,9 @@
2
2
  <body>
3
3
  Here's some text
4
4
  <p concordion:set="#username">Chuck Norris</p>
5
+ <p concordion:set="#mnks">Monkeys</p>
6
+ <p concordion:set="#mnks">Monkeys</p>
7
+
5
8
  <p concordion:assertEquals="greetingFor(#username)">Hello Chuck Norris, you nancy-boy.</p>
6
9
  it should be in the output.
7
10
  </body>
@@ -2,5 +2,13 @@
2
2
  <body>
3
3
  <p concordion:execute="set_name(#TEXT)">No</p>
4
4
  <p concordion:assertEquals="double_down()">NoNo</p>
5
+
6
+ <p concordion:execute="#result = return_arg(#TEXT)">Working Text</p>
7
+ <p concordion:assertEquals="#result">Working Text</p>
8
+
9
+ <p concordion:execute="#result = concat(#TEXT,#TEXT)">Working Text 2</p>
10
+ <p concordion:assertEquals="#result">Working Text 2:Working Text 2</p>
11
+
12
+
5
13
  </body>
6
14
  </html>
@@ -6,6 +6,17 @@ class BasicTextTest < ConcordionTestCase
6
6
  @name = name
7
7
  end
8
8
 
9
+ def return_arg(arg)
10
+ arg
11
+ end
12
+
13
+ def concat(a,b)
14
+ raise "second arg nil" if b.nil?
15
+ raise "first arg nil" if a.nil?
16
+
17
+ "#{a}:#{b}"
18
+ end
19
+
9
20
  def double_down
10
21
  "#{@name*2}"
11
22
  end
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
  require 'concordion_parse_result'
3
-
3
+ require 'rubygems'
4
+ require 'mocha'
4
5
  class ConcordionParseResultTest < Test::Unit::TestCase
5
6
 
6
7
  def test_is_set_command
@@ -8,6 +9,11 @@ class ConcordionParseResultTest < Test::Unit::TestCase
8
9
  assert !ConcordionParseResult.new("asdf",nil,nil,nil).is_set_command?
9
10
  end
10
11
 
12
+ def test_is_assert_image_command
13
+ assert ConcordionParseResult.new("assert_image",nil,nil,nil).is_assert_image_command?
14
+ assert !ConcordionParseResult.new("set",nil,nil,nil).is_assert_image_command?
15
+ end
16
+
11
17
  def test_is_execute_command
12
18
  assert ConcordionParseResult.new("execute",nil,nil,nil).is_execute_command?
13
19
  assert !ConcordionParseResult.new("asdf",nil,nil,nil).is_execute_command?
@@ -17,7 +23,16 @@ class ConcordionParseResultTest < Test::Unit::TestCase
17
23
  assert ConcordionParseResult.new("verifyrows",nil,nil,nil).is_verify_command?
18
24
  assert !ConcordionParseResult.new("monkeys",nil,nil,nil).is_verify_command?
19
25
  end
26
+ def test_is_asserttrue_command
27
+ assert ConcordionParseResult.new("asserttrue",nil,nil,nil).is_assert_true_command?
28
+ assert !ConcordionParseResult.new("monkeys",nil,nil,nil).is_assert_true_command?
29
+ end
20
30
 
31
+ def test_image_location
32
+ tag = mock("tag")
33
+ tag.expects(:get_attribute).with('src').returns "foo"
34
+ assert_equal "foo", ConcordionParseResult.new(nil,nil,nil, tag).image_location
35
+ end
21
36
  def test_assignment
22
37
  assert_equal "#user", ConcordionParseResult.new("verifyrows"," #user = asdfasdf",nil,nil).assignment
23
38
  assert_equal "#bob", ConcordionParseResult.new("monkeys","#bob=asdf",nil,nil).assignment
@@ -15,20 +15,6 @@ class ConcordionTest < Test::Unit::TestCase
15
15
  assert_equal "bar", @concordion.get_variable("#foo")
16
16
  end
17
17
 
18
- def test_build_invocation_string
19
- assert_equal "self.send('foo')", @concordion.build_invocation_string("foo()", "content")
20
- @concordion.set_variable("#bar", "baz")
21
- assert_equal "self.send('foo', 'baz')", @concordion.build_invocation_string("foo(#bar)", "content")
22
-
23
- @concordion.set_variable("#purplemonkey", "dishwasher")
24
- assert_equal "self.send('other', 'baz', 'dishwasher')", @concordion.build_invocation_string("other(#bar, #purplemonkey)", "content")
25
- end
26
-
27
- def test_build_invocation_string_replaces_text
28
- assert_equal "self.send('foo', 'ASDF')", @concordion.build_invocation_string("foo(#TEXT)", "ASDF")
29
-
30
- end
31
-
32
18
  def test_dereference
33
19
  @concordion.set_variable("#result", @thingy)
34
20