rcor 0.8.1 → 0.9.5

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.
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