graffle 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/History.txt +9 -0
  2. data/Manifest.txt +15 -8
  3. data/Rakefile.hoe +1 -2
  4. data/bin/interpret-intentions.rb +51 -0
  5. data/examples/objects with notes.rb +1 -0
  6. data/examples/old-style-rails-workflow-test.expected +11 -0
  7. data/examples/old-style-rails-workflow-test.rb +43 -0
  8. data/examples/rails-workflow-test.rb +7 -6
  9. data/examples/sheet with key.expected +5 -0
  10. data/examples/sheet with key.graffle +0 -0
  11. data/examples/sheet with key.rb +38 -0
  12. data/graffle.tmproj +242 -75
  13. data/lib/graffle.rb +11 -2
  14. data/lib/graffle/nodoc/hacks.rb +1 -0
  15. data/lib/graffle/point.rb +1 -0
  16. data/lib/graffle/stereotypes.rb +34 -3
  17. data/lib/graffle/version.rb +3 -1
  18. data/lib/graphical_tests_for_rails.rb +11 -9
  19. data/lib/graphical_tests_for_rails/jumbled-string-canonicalizer.rb +117 -0
  20. data/lib/graphical_tests_for_rails/orderings.rb +1 -2
  21. data/lib/graphical_tests_for_rails/picture-applier.rb +257 -0
  22. data/lib/graphical_tests_for_rails/stereotype-extensions.rb +111 -0
  23. data/lib/graphical_tests_for_rails/text-appliers.rb +10 -84
  24. data/lib/graphical_tests_for_rails/user-intention.rb +250 -0
  25. data/test/abstract-graphic-tests.rb +10 -0
  26. data/test/container-tests.rb +29 -0
  27. data/test/graphical_tests_for_rails/jumbled-string-canonicalizer-tests.rb +174 -0
  28. data/test/graphical_tests_for_rails/new-style-picture-applier-tests.rb +286 -0
  29. data/test/graphical_tests_for_rails/old-style-picture-applier-tests.rb +129 -0
  30. data/test/graphical_tests_for_rails/user-intention-tests.rb +389 -0
  31. data/test/graphical_tests_for_rails/util.rb +9 -0
  32. data/test/sheet-tests.rb +21 -0
  33. data/test/text-tests.rb +6 -0
  34. metadata +25 -26
  35. data/design-notes/graphical-tests-for-rails-objects.graffle +0 -644
  36. data/lib/graphical_tests_for_rails/graphic-volunteers.rb +0 -75
  37. data/lib/graphical_tests_for_rails/picture-appliers.rb +0 -225
  38. data/lib/graphical_tests_for_rails/volunteer-pool.rb +0 -115
  39. data/test/graphical_tests_for_rails/deprecated-graphic-interpreter-tests.rb +0 -121
  40. data/test/graphical_tests_for_rails/graphic-volunteer-tests.rb +0 -218
  41. data/test/graphical_tests_for_rails/picture-applier-tests.rb +0 -215
  42. data/test/graphical_tests_for_rails/text-applier-tests.rb +0 -111
@@ -1,218 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # Created by Brian Marick on 2007-07-20.
4
- # Copyright (c) 2007. All rights reserved.
5
-
6
- require 'test/unit'
7
- require 's4t-utils'
8
- include S4tUtils
9
-
10
- require "../set-standalone-test-paths.rb" unless $started_from_rakefile
11
-
12
- require 'graphical_tests_for_rails/graphic-volunteers'
13
- require 'graphical_tests_for_rails/volunteer-pool'
14
- require 'graffle'
15
-
16
- class GraphicVolunteerTest < Test::Unit::TestCase
17
- include GraphicalTestsForRails
18
- include Graffle::Builders
19
-
20
- def setup
21
- @pool = GraphicVolunteerPool.new
22
- end
23
-
24
- def test_untrained_volunteer_wants_to_handle_everything
25
- assert_true(GraphicVolunteer.new('irrelevant').likes?(Object.new))
26
- end
27
-
28
- def test_untrained_volunteer_does_not_even_try_to_extract_lines
29
- assert_equal([], GraphicVolunteer.new('irrelevent').extract_lines(Object.new))
30
- end
31
-
32
- # Trained volunteers will be fetched from the pool, then tested.
33
-
34
- def test_volunteers_must_be_fetched_with_known_names
35
- assert_raises(StandardError) {
36
- @pool.mobilize_form_watcher('nothing')
37
- }
38
- end
39
-
40
-
41
-
42
- def test_some_volunteers_go_for_shaped_graphic_content
43
- volunteer = @pool.mobilize_form_watcher('shaped graphic content')
44
-
45
- assert_false(volunteer.likes?(abstract_graphic))
46
- assert_false(volunteer.likes?(shaped_graphic))
47
- assert_false(volunteer.likes?(shaped_graphic { with_note "hello" }))
48
- assert_true(volunteer.likes?(shaped_graphic { with_content "hello" }))
49
- end
50
-
51
- def test_those_volunteers_extract_only_shaped_graphic_content_lines
52
- volunteer = @pool.mobilize_form_watcher('shaped graphic content')
53
- graphic = shaped_graphic {
54
- with_content "expected"
55
- with_note "not expected"
56
- }
57
-
58
- assert_equal(["expected"], volunteer.extract_lines(graphic))
59
- end
60
-
61
- def test_som_volunteers_go_for_line_label_content
62
- # Here are the pieces of the structure that matter:
63
- empty_label = good_label = no_label = nil
64
-
65
- s = sheet {
66
- with label_without_text = line_label {
67
- for_line 1
68
- }
69
- with label_with_fine_text = line_label {
70
- for_line 2
71
- with_content "hi"
72
- }
73
- with empty_label = line_graphic { graffle_id_is 1 }
74
- with good_label = line_graphic { graffle_id_is 2 }
75
- with no_label = line_graphic { graffle_id_is 3 }
76
- }
77
-
78
- volunteer = @pool.mobilize_form_watcher('line label content')
79
-
80
- assert_false(volunteer.likes?(shaped_graphic { with_content 'foo' }))
81
- assert_false(volunteer.likes?(empty_label))
82
- assert_false(volunteer.likes?(no_label))
83
- assert_true(volunteer.likes?(good_label))
84
- end
85
-
86
- def test_those_volunteers_extract_only_line_label_content_lines
87
- volunteer = @pool.mobilize_form_watcher('line label content')
88
-
89
- s = sheet {
90
- with line_graphic {
91
- graffle_id_is 1
92
- }
93
-
94
- with line_label {
95
- for_line 1
96
- with_content "expected"
97
- with_note "not expected"
98
- }
99
- }
100
-
101
- assert_equal(["expected"], volunteer.extract_lines(s.find_by_id(1)))
102
- end
103
-
104
-
105
- def test_some_volunteers_go_for_notes_attached_to_anything
106
- # Here are the pieces of the structure that matter:
107
- shaped_with_note = shaped_graphic {
108
- graffle_id_is 1
109
- with_note "this matches"
110
- }
111
- shaped_without_note = shaped_graphic {
112
- graffle_id_is 2
113
- with_content "this does not"
114
- }
115
- line_graphic_with_nothing = line_graphic
116
- line_graphic_with_only_label_text = line_graphic {
117
- # label added below.
118
- graffle_id_is 999
119
- }
120
- line_graphic_with_note = line_graphic {
121
- # label added below
122
- graffle_id_is 888
123
- }
124
-
125
- s = sheet {
126
- with shaped_with_note
127
- with shaped_without_note
128
- with line_graphic_with_nothing
129
- with line_graphic_with_only_label_text
130
- with line_graphic_with_note
131
-
132
- with line_label {
133
- for_line line_graphic_with_only_label_text.graffle_id
134
- with_content "unmatching line label"
135
- }
136
- with line_label {
137
- for_line line_graphic_with_note.graffle_id
138
- with_note "matching line label - has note"
139
- }
140
- }
141
-
142
- volunteer = @pool.mobilize_form_watcher('note')
143
- assert_true(volunteer.likes?(shaped_with_note))
144
- assert_false(volunteer.likes?(shaped_without_note))
145
- assert_false(volunteer.likes?(line_graphic_with_nothing))
146
- assert_false(volunteer.likes?(line_graphic_with_only_label_text))
147
- assert_true(volunteer.likes?(line_graphic_with_note))
148
- end
149
-
150
- def test_those_volunteers_extract_only_note_lines
151
- shaped_with_note = shaped_graphic { with_note "expected" }
152
- line_with_label_note = line_graphic { graffle_id_is 1 } # label added later
153
- line_with_own_note = line_graphic { with_note "expected"}
154
- line_with_both = line_graphic {
155
- graffle_id = 999
156
- with_note "expected"
157
- }
158
-
159
- s = sheet {
160
- with shaped_with_note
161
- with line_with_label_note
162
- with line_with_own_note
163
- with line_with_both
164
- with line_label {
165
- for_line line_with_label_note.graffle_id
166
- with_note "expected"
167
- }
168
- with line_label {
169
- for_line line_with_both.graffle_id
170
- with_note "NOT expected - line note takes precedence"
171
- }
172
- }
173
-
174
- volunteer = @pool.mobilize_form_watcher('note')
175
-
176
- assert_equal(["expected"], volunteer.extract_lines(shaped_with_note))
177
- assert_equal(["expected"], volunteer.extract_lines(line_with_label_note))
178
- assert_equal(["expected"], volunteer.extract_lines(line_with_own_note))
179
- assert_equal(["expected"], volunteer.extract_lines(line_with_both))
180
- end
181
-
182
- #
183
- # Content volunteers look at lines of text, not graphics.
184
- # They don't extract lines, so that's not tested.
185
- #
186
-
187
- def test_some_content_volunteers_go_for_text_with_ellipses
188
- volunteer = @pool.mobilize_content_watcher('text...')
189
-
190
- assert_true(volunteer.likes?(["foo..."]))
191
- assert_true(volunteer.likes?(["foo.."])) # allow typos
192
- assert_true(volunteer.likes?(["foo...."]))
193
- assert_true(volunteer.likes?(["foo.... "]))
194
- assert_false(volunteer.likes?(["foo...b"]))
195
- end
196
-
197
- def test_some_content_volunteers_go_for_text_to_be_ignored
198
- volunteer = @pool.mobilize_content_watcher('ignore')
199
-
200
- assert_true(volunteer.likes?(["ignore"]))
201
- assert_true(volunteer.likes?([" ignore "]))
202
- assert_false(volunteer.likes?(["something else"]))
203
- assert_true(volunteer.likes?(["something else", "ignore"]))
204
- end
205
-
206
- def test_content_volunteers_are_chained_after_form_volunteers
207
- graphic_volunteer = @pool.mobilize_form_watcher('note')
208
- text_volunteer = @pool.mobilize_content_watcher('text...')
209
-
210
- g = shaped_graphic { with_note "no ellipses" }
211
- assert_true(graphic_volunteer.likes?(g))
212
- graphic_volunteer.next = text_volunteer
213
- assert_false(graphic_volunteer.likes?(g))
214
-
215
- assert_true(graphic_volunteer.likes?(shaped_graphic{ with_note "..."}))
216
- end
217
-
218
- end
@@ -1,215 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # Created by Brian Marick on 2007-07-20.
4
- # Copyright (c) 2007. All rights reserved.
5
-
6
- require 'test/unit'
7
- require 's4t-utils'
8
- include S4tUtils
9
-
10
- require "../set-standalone-test-paths.rb" unless $started_from_rakefile
11
-
12
- require 'extensions/string'
13
- require 'test/graphical_tests_for_rails/util'
14
- require 'graffle'
15
- require 'graphical_tests_for_rails/picture-appliers'
16
-
17
- class PictureApplierTest < Test::Unit::TestCase
18
- include Graffle
19
- include Graffle::Builders
20
- include GraphicalTestsForRails
21
- include GraphicalTestsForRails::TextAppliers
22
-
23
- def setup
24
- @sheet = sheet {
25
- with shaped_graphic {
26
- graffle_id_is 1
27
- with_content 'shaped graphic text...'
28
- }
29
- with line_label {
30
- for_line 22
31
- with_content 'line label text...'
32
- }
33
- with line_graphic {
34
- graffle_id_is 22
35
- }
36
- with shaped_graphic { # no text
37
- graffle_id_is 333
38
- }
39
- with line_graphic { # no label
40
- graffle_id_is 4444
41
- }
42
- }
43
- end
44
-
45
- def shaped_graphic_with_content; @sheet.find_by_id(1); end
46
- def shaped_graphic_without_text; @sheet.find_by_id(333); end
47
- def line_graphic_with_label; @sheet.find_by_id(22); end
48
- def line_graphic_without_label; @sheet.find_by_id(4444); end
49
-
50
-
51
- def test_empty_applier_produces_eager_but_useless_volunteer
52
- @applier = PictureApplier.new
53
- g = shaped_graphic { with_content 'foo' }
54
- assert_equal(EagerButUselessVolunteer, @applier.find_volunteer_for(g).class)
55
- # Or, as shorthand:
56
- assert_eager_but_useless_volunteer_for(g)
57
- end
58
-
59
- def assert_eager_but_useless_volunteer_for(graphic)
60
- assert_equal(EagerButUselessVolunteer, @applier.find_volunteer_for(graphic).class)
61
- end
62
-
63
- def assert_trained_volunteer_for(graphic)
64
- assert_not_equal(EagerButUselessVolunteer, @applier.find_volunteer_for(graphic).class)
65
- end
66
-
67
- def test_useless_volunteer_does_nothing
68
- # ... so we can just test for it rather than having it do something.
69
- @applier = PictureApplier.new
70
- g = shaped_graphic { with_note 'foo' }
71
- @applier.apply([g], "will blow up if used")
72
- end
73
-
74
-
75
- # Some examples of how a PictureApplier can use the Volunteer
76
- # mechanism to prepare volunteers trained for certain kinds
77
- # of graphics.
78
- def test_can_recruit_trained_volunteers_for_shaped_graphic_contents
79
- @applier = PictureApplier.new {
80
- given('shaped graphic content') # ... chained methods go here
81
- }
82
-
83
- assert_trained_volunteer_for(shaped_graphic_with_content)
84
- assert_eager_but_useless_volunteer_for(shaped_graphic_without_text)
85
- assert_eager_but_useless_volunteer_for(line_graphic_with_label)
86
- end
87
-
88
- def test_can_recruit_trained_volunteers_for_line_graphic_labels
89
- @applier = PictureApplier.new {
90
- given('line label content') # ... chained methods go here
91
- }
92
-
93
- assert_trained_volunteer_for(line_graphic_with_label)
94
- assert_eager_but_useless_volunteer_for(line_graphic_without_label)
95
- assert_eager_but_useless_volunteer_for(shaped_graphic_with_content)
96
- end
97
-
98
- def test_there_is_a_fixed_set_of_graphically_oriented_volunteers
99
- assert_raises(StandardError) {
100
- PictureApplier.new { given 'oopsla' }
101
- }
102
- end
103
-
104
-
105
- # Examples of using the 'matching' clause to augment a
106
- # graphically-oriented volunteer with a textually-oriented one.
107
-
108
- def test_can_augment_a_volunteer_to_look_for_ellipses
109
- @applier = PictureApplier.new {
110
- given('shaped graphic content').matching('text...') # ... chained methods go here
111
- }
112
-
113
- assert_trained_volunteer_for(shaped_graphic { with_content "blah..." })
114
- assert_eager_but_useless_volunteer_for(shaped_graphic { with_content "blah" })
115
- assert_eager_but_useless_volunteer_for(shaped_graphic)
116
- assert_eager_but_useless_volunteer_for(line_graphic_with_label)
117
- end
118
-
119
- def test_there_is_a_fixed_set_of_textually_oriented_volunteers
120
- ok_so_far = PictureApplier.new { given 'shaped graphic content' }
121
- assert_raises(StandardError) {
122
- ok_so_far.matching('something never defined')
123
- }
124
- end
125
-
126
- # An example of how it's all put together to send messages to targets.
127
-
128
- class Echoer < AbstractTextApplier
129
- def message_and_args_from(string)
130
- [:echo, string]
131
- end
132
- end
133
-
134
- def test_application_of_matches
135
- @applier = PictureApplier.new {
136
- given('note').matching('text...').skip
137
- given('note').use(Echoer.new)
138
- }
139
-
140
- s = sheet {
141
- with shaped_graphic { with_notes 'hello world' }
142
- with line_graphic
143
- with shaped_graphic { with_notes "waiting..."}
144
- with line_graphic { with_notes "goodbye world" }
145
- }
146
-
147
- target = CommandRecorder.new
148
- @applier.apply(s.graphics, target)
149
- assert_equal(['echo("hello world")', 'echo("goodbye world")'],
150
- target.record)
151
- end
152
-
153
-
154
- class ThriceThenDie
155
- include Test::Unit::Assertions
156
-
157
- def initialize
158
- @count = 0
159
- end
160
-
161
- def echo(value)
162
- @count += 1
163
- assert_equal("right", "wrong") if @count >= 4
164
- end
165
-
166
- end
167
-
168
- def four_counting_shaped_graphics
169
- sheet {
170
- with shaped_graphic { with_content "first" }
171
- with shaped_graphic { with_content "second" }
172
- with shaped_graphic { with_content "third" }
173
- with shaped_graphic { with_content "yikes!"}
174
- }.graphics
175
- end
176
-
177
- def four_graphic_contents
178
- four_counting_shaped_graphics.collect { |g| g.content.as_plain_text }
179
- end
180
-
181
- def assert_thrice_then_die_log(exc, expected_echoed)
182
- assert_match(/right.*expected.*was.*wrong/m, exc.message)
183
- expected = expected_echoed.collect do |w|
184
- "echo\\(" + w.inspect + "\\)"
185
- end.join('.*')
186
- assert_match(/#{expected}/m, exc.message)
187
- end
188
-
189
- def test_logging_prints_list_of_calls_into_target
190
- @applier = PictureApplier.new {
191
- given('shaped graphic content').use(Echoer.new)
192
- }
193
- begin
194
- @applier.apply(four_counting_shaped_graphics, ThriceThenDie.new)
195
- rescue Test::Unit::AssertionFailedError => e
196
- assert_thrice_then_die_log(e, four_graphic_contents)
197
- end
198
- end
199
-
200
- def test_log_can_be_injected
201
- def test_logging_prints_list_of_calls_into_target
202
- @applier = PictureApplier.new {
203
- given('shaped graphic content').use(Echoer.new)
204
- }
205
- begin
206
- @applier.apply(four_counting_shaped_graphics,
207
- ThriceThenDie.new,
208
- ['echo("prior value of log")'])
209
- rescue Test::Unit::AssertionFailedError => e
210
- assert_thrice_then_die_log(e, ["prior value of log"] + four_graphic_contents)
211
- end
212
- end
213
- end
214
-
215
- end
@@ -1,111 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # Created by Brian Marick on 2007-07-11.
4
- # Copyright (c) 2007. All rights reserved.
5
-
6
- require "../set-standalone-test-paths.rb" unless $started_from_rakefile
7
-
8
- require 'test/unit'
9
- require 's4t-utils'
10
- include S4tUtils
11
-
12
- require 'extensions/string'
13
- require 'graphical_tests_for_rails'
14
-
15
-
16
- class TestProductionOfMessages < Test::Unit::TestCase
17
- include GraphicalTestsForRails
18
-
19
- def assert_translation(expected, original)
20
- actual = @interpreter.message_and_args_from(original)
21
- assert_equal(expected, actual)
22
- end
23
-
24
- def test_messages_whose_arguments_come_from_quoted_text
25
- @interpreter = ArgsFromQuotedText.new
26
-
27
- assert_translation(['token'], "token")
28
- assert_translation(['underscore_separated_tokens'],
29
- 'underscore separated tokens'
30
- )
31
- assert_translation(['whitespace_is_handled_intelligently'],
32
- " whitespace\tis handled intelligently "
33
- )
34
- assert_translation(['here_is_an', 'argument'],
35
- 'here is an "argument"'
36
- )
37
- assert_translation(['single_spaces_are_args', 'too '],
38
- " single spaces are args 'too ' "
39
- )
40
- assert_translation(['multiple', 'arguments', "work"],
41
- %q{multiple 'arguments' "work"}
42
- )
43
- assert_translation(['only_the', 'prefix', "command"],
44
- %q{only the 'prefix' is included in the 'command'}
45
- )
46
-
47
- assert_translation(['arguments_can', 'be', 'comma', "separated"],
48
- %q{arguments can 'be', 'comma', and 'separated'}
49
- )
50
-
51
- assert_translation(['stuff_after_the', 'last', 'argument'],
52
- %q{stuff after the 'last' 'argument' is ignored.}
53
- )
54
-
55
- assert_translation(['even_if_it_is_just', 'a period'],
56
- %q{even if it is just 'a period'.}
57
- )
58
-
59
- assert_translation(['the_method_ignores_punctuation'],
60
- %q{the method (ignores) punctuation.}
61
- )
62
-
63
- assert_translation(['except_that_dashes_become_underscore'],
64
- %q{except that dashes become-underscore}
65
- )
66
-
67
- assert_translation(["its_possible_to_have_quotes_within_words"],
68
- %q{it's possible to have quotes within words}
69
- )
70
-
71
- assert_translation(["while_a_messages_quotes_are_stripped", "an argument's are retained"],
72
- %q{while a message's quotes are stripped, "an argument's are retained"}
73
- )
74
-
75
- assert_translation(["capitals_are_lowercased_throughout"],
76
- %q{Capitals are lowercased THROUGHOUT})
77
- end
78
-
79
- def test_messages_created_from_prefix_name_and_quoted_args
80
- @interpreter = PrefixNameAndArgsFromQuotedText.new
81
-
82
- assert_translation(["runs", "nathan"],
83
- %q{Nathan runs})
84
-
85
- assert_translation(["runs_to", "nathan", "Tacoma"],
86
- %q{Nathan runs to "Tacoma"})
87
-
88
- assert_raises_with_matching_message(StandardError, /'runs' cannot be split into a name and an action./) {
89
- @interpreter.message_and_args_from('runs')
90
- }
91
- end
92
-
93
- def test_messages_created_from_page_names
94
- @interpreter = TextAsNameOfPage.new('assert_on_page')
95
- assert_translation(['assert_on_page', "markup"],
96
- "MARKUP")
97
-
98
- assert_translation(['assert_on_page', "outside-spaces"],
99
- " outside-spaces ")
100
-
101
- # TODO: don't know what makes sense for interior spaces or
102
- # non-\w characters.
103
-
104
- end
105
-
106
-
107
- def test_ineffectual_interpreters_produce_messages_that_do_nothing
108
- @interpreter = TextApplierThatDoesNothing.new
109
- assert_translation([:object_id], "MARKUP")
110
- end
111
- end