graffle 0.1.9 → 0.2.0

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