weft-qda 0.9.6 → 0.9.8

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 (86) hide show
  1. data/lib/weft.rb +16 -1
  2. data/lib/weft/WEFT-VERSION-STRING.rb +1 -1
  3. data/lib/weft/application.rb +17 -74
  4. data/lib/weft/backend.rb +6 -32
  5. data/lib/weft/backend/sqlite.rb +222 -164
  6. data/lib/weft/backend/sqlite/category_tree.rb +52 -48
  7. data/lib/weft/backend/sqlite/database.rb +57 -0
  8. data/lib/weft/backend/sqlite/upgradeable.rb +7 -0
  9. data/lib/weft/broadcaster.rb +90 -0
  10. data/lib/weft/category.rb +139 -47
  11. data/lib/weft/codereview.rb +160 -0
  12. data/lib/weft/coding.rb +74 -23
  13. data/lib/weft/document.rb +23 -10
  14. data/lib/weft/exceptions.rb +10 -0
  15. data/lib/weft/filters.rb +47 -224
  16. data/lib/weft/filters/indexers.rb +137 -0
  17. data/lib/weft/filters/input.rb +118 -0
  18. data/lib/weft/filters/output.rb +101 -0
  19. data/lib/weft/filters/templates.rb +80 -0
  20. data/lib/weft/filters/win32backtick.rb +246 -0
  21. data/lib/weft/query.rb +169 -0
  22. data/lib/weft/wxgui.rb +349 -294
  23. data/lib/weft/wxgui/constants.rb +43 -0
  24. data/lib/weft/wxgui/controls.rb +6 -0
  25. data/lib/weft/wxgui/controls/category_dropdown.rb +192 -0
  26. data/lib/weft/wxgui/controls/category_tree.rb +314 -0
  27. data/lib/weft/wxgui/controls/document_list.rb +97 -0
  28. data/lib/weft/wxgui/controls/multitype_control.rb +37 -0
  29. data/lib/weft/wxgui/{inspectors → controls}/textcontrols.rb +235 -64
  30. data/lib/weft/wxgui/dialogs.rb +144 -41
  31. data/lib/weft/wxgui/error_handler.rb +116 -36
  32. data/lib/weft/wxgui/exceptions.rb +7 -0
  33. data/lib/weft/wxgui/inspectors.rb +61 -208
  34. data/lib/weft/wxgui/inspectors/category.rb +19 -16
  35. data/lib/weft/wxgui/inspectors/codereview.rb +90 -132
  36. data/lib/weft/wxgui/inspectors/document.rb +12 -8
  37. data/lib/weft/wxgui/inspectors/imagedocument.rb +56 -56
  38. data/lib/weft/wxgui/inspectors/query.rb +284 -0
  39. data/lib/weft/wxgui/inspectors/script.rb +147 -23
  40. data/lib/weft/wxgui/lang/en.rb +69 -0
  41. data/lib/weft/wxgui/sidebar.rb +90 -432
  42. data/lib/weft/wxgui/utilities.rb +70 -91
  43. data/lib/weft/wxgui/workarea.rb +150 -43
  44. data/share/icons/category.ico +0 -0
  45. data/share/icons/category.xpm +109 -0
  46. data/share/icons/codereview.ico +0 -0
  47. data/share/icons/codereview.xpm +54 -0
  48. data/share/icons/d_and_c.xpm +126 -0
  49. data/share/icons/document.ico +0 -0
  50. data/share/icons/document.xpm +70 -0
  51. data/share/icons/project.ico +0 -0
  52. data/share/icons/query.ico +0 -0
  53. data/share/icons/query.xpm +56 -0
  54. data/{lib/weft/wxgui → share/icons}/search.xpm +0 -0
  55. data/share/icons/weft.ico +0 -0
  56. data/share/icons/weft.xpm +62 -0
  57. data/share/icons/weft16.ico +0 -0
  58. data/share/icons/weft32.ico +0 -0
  59. data/share/templates/category_plain.html +18 -0
  60. data/share/templates/codereview_plain.html +18 -0
  61. data/share/templates/document_plain.html +13 -0
  62. data/share/templates/document_plain.txt +7 -0
  63. data/test/001-document.rb +55 -36
  64. data/test/002-category.rb +81 -6
  65. data/test/003-code.rb +8 -4
  66. data/test/004-application.rb +13 -34
  67. data/test/005-query_review.rb +139 -0
  68. data/test/006-filters.rb +54 -42
  69. data/test/007-output_filters.rb +113 -0
  70. data/test/009a-backend_sqlite_basic.rb +95 -24
  71. data/test/009b-backend_sqlite_complex.rb +43 -62
  72. data/test/009c_backend_sqlite_bench.rb +5 -10
  73. data/test/053-doc_inspector.rb +46 -0
  74. data/test/055-query_window.rb +50 -0
  75. data/test/all-tests.rb +1 -0
  76. data/test/test-common.rb +19 -0
  77. data/test/testdata/empty.qdp +0 -0
  78. data/test/testdata/simple with space.pdf +0 -0
  79. data/test/testdata/simple.pdf +0 -0
  80. data/weft-qda.rb +40 -7
  81. metadata +74 -14
  82. data/lib/weft/wxgui/category.xpm +0 -26
  83. data/lib/weft/wxgui/document.xpm +0 -25
  84. data/lib/weft/wxgui/inspectors/search.rb +0 -265
  85. data/lib/weft/wxgui/mondrian.xpm +0 -44
  86. data/lib/weft/wxgui/weft16.xpm +0 -31
Binary file
Binary file
@@ -0,0 +1,18 @@
1
+ # EXPORT_CLASS : Category
2
+ # DESCRIPTION : Category as simple HTML webpage
3
+ # CLASSNAME : CategoryHTMLOutput
4
+ <html>
5
+ <head>
6
+ <title>[% var obj.name :html %]</title>
7
+ </head>
8
+ <body>
9
+ <h1>[% var obj.name :html %]</h1>
10
+ [% loop text.sets %]
11
+ <h2>[% var title %]
12
+ <!-- [% var length %] passages, [% var num_of_chars %] characters --></h2>
13
+ [% loop items %]
14
+ <p>[% var text :html %] (at point [% var offset %])</p>
15
+ [% end %]
16
+ [% end %]
17
+ </body>
18
+ </html>
@@ -0,0 +1,18 @@
1
+ # EXPORT_CLASS : CodeReview
2
+ # DESCRIPTION : Code Review as HTML table
3
+ # CLASSNAME : CodeReviewHTMLOutput
4
+ <html>
5
+ <head>
6
+ <title>Code Review [% var obj.dbid %]</title>
7
+ </head>
8
+ <body>
9
+ <h1>Code Review [% var obj.dbid %]</h1>
10
+ <table>
11
+ [% loop obj.output_rows %]
12
+ <tr>
13
+ [% loop to_a %]<td>[% var to_s %]</td>
14
+ [% end %]
15
+ </tr>[% end %]
16
+ </table>
17
+ </body>
18
+ </html>
@@ -0,0 +1,13 @@
1
+ # EXPORT_CLASS : Document
2
+ # DESCRIPTION : Document as simple HTML webpage
3
+ # CLASSNAME : DocumentHTMLOutput
4
+ <html>
5
+ <head>
6
+ <title>[% var obj.title :html %]</title>
7
+ </head>
8
+ <body>
9
+ <h1>[% var obj.title :html %]</h1>
10
+ <p>[% var obj.memo :html %]</p>
11
+ [% var obj.text :html_paras %]
12
+ </body>
13
+ </html>
@@ -0,0 +1,7 @@
1
+ # EXPORT_CLASS : Document
2
+ # DESCRIPTION : Document as plain text
3
+ # CLASSNAME : DocumentTextOutput
4
+ Title: [% var obj.title %]
5
+ Memo: [% var obj.memo %]
6
+
7
+ [% var obj.text %]
@@ -1,16 +1,15 @@
1
- $:.push('../lib/')
1
+ require 'test-common'
2
2
 
3
3
  require 'weft/document'
4
- require 'test/unit'
5
4
  require 'weft/category'
6
5
 
7
- class TestDocument < Test::Unit::TestCase
8
- def setup
6
+ require 'test/unit'
9
7
 
10
- end
8
+ class TestDocument < Test::Unit::TestCase
9
+ include QDA
11
10
 
12
11
  def test_basic
13
- d = QDA::Document.new('The Title')
12
+ d = Document.new('The Title')
14
13
  assert_equal('The Title', d.title,
15
14
  'Set title at initialisation')
16
15
  assert_equal(0, d.length,
@@ -40,35 +39,44 @@ class TestDocument < Test::Unit::TestCase
40
39
  end
41
40
 
42
41
  def test_fragment
43
- d = QDA::Document.new('The Title')
42
+ d = Document.new('The Title')
44
43
  d.append('abc def ghi jkl')
45
44
  d.append('ABC DEF GHI JKL')
45
+
46
+ # at the beginning
46
47
  fr_1 = d[0,4]
47
48
  assert_equal(0, fr_1.offset, 'Give offset correctly')
48
49
  assert_equal(4, fr_1.end, 'Give end correctly')
49
50
  assert_equal('abc ', fr_1, 'String equality')
51
+ assert_equal(d.title, fr_1.title)
52
+ assert_equal(d[fr_1.offset, fr_1.length].to_s, fr_1.to_s, 'String correct')
50
53
 
54
+ # in the middle
51
55
  fr_2 = d[2,5]
52
56
  assert_equal(2, fr_2.offset, 'Give offset correctly')
53
57
  assert_equal(7, fr_2.end, 'Give end correctly')
58
+ assert_equal(d[fr_2.offset, fr_2.length].to_s, fr_2.to_s)
54
59
 
55
- fr_3 = d[12,6]
56
- assert_equal(12, fr_3.offset, 'Give offset correctly')
57
- assert_equal(18, fr_3.end, 'Give end correctly')
60
+
61
+ # past the end
62
+ fr_3 = d[25,12]
63
+ assert_equal(25, fr_3.offset, 'Give offset correctly')
64
+ assert_equal(7, fr_3.length, 'Give length correctly')
65
+ assert_equal(d[fr_3.offset, fr_3.length].to_s, fr_3.to_s, 'String correct')
58
66
 
59
67
  fr_3.docid = 1
60
68
  code = fr_3.to_code()
61
69
  assert_equal(1, code.docid)
62
- assert_equal(12, code.offset)
63
- assert_equal(6, code.length)
70
+ assert_equal(25, code.offset)
71
+ assert_equal(7, code.length)
64
72
  end
65
73
 
66
74
  def test_fragment_equivalence
67
- c_1 = QDA::Fragment.new('ABC', 'title', 5)
68
- c_2 = QDA::Fragment.new('XYZ', 'title', 0)
69
- c_3 = QDA::Fragment.new('ABC', 'other', 5)
70
- c_4 = QDA::Fragment.new('ABC', 'title', 50)
71
- c_5 = QDA::Fragment.new('ABC', 'title', 5)
75
+ c_1 = Fragment.new('ABC', 'title', 5)
76
+ c_2 = Fragment.new('XYZ', 'title', 0)
77
+ c_3 = Fragment.new('ABC', 'other', 5)
78
+ c_4 = Fragment.new('ABC', 'title', 50)
79
+ c_5 = Fragment.new('ABC', 'title', 5)
72
80
 
73
81
  assert(c_1 == c_1, 'Identity Equality')
74
82
  assert(c_1 == c_5, 'Equivalence Equality')
@@ -76,24 +84,24 @@ class TestDocument < Test::Unit::TestCase
76
84
  assert(c_1 != c_3, 'Document inequality')
77
85
  assert(c_1 != c_4, 'Offset inequality')
78
86
 
79
- c_1 = QDA::Fragment.new('ABCDEF', 'title', 5)
80
- c_2 = QDA::Fragment.new('DEFGH', 'title', 8)
87
+ c_1 = Fragment.new('ABCDEF', 'title', 5)
88
+ c_2 = Fragment.new('DEFGH', 'title', 8)
81
89
 
82
90
  assert(c_1.overlap?(c_2), 'Overlap 1/2')
83
91
  assert(c_2.overlap?(c_1), 'Overlap 1/1')
84
92
  assert(c_1.touch?(c_2), 'Touch 1/1')
85
93
  assert(c_2.touch?(c_1), 'Touch 1/2')
86
94
 
87
- c_1 = QDA::Fragment.new('ABCDEF', 'title', 5)
88
- c_2 = QDA::Fragment.new('GHIJKL', 'title', 11)
95
+ c_1 = Fragment.new('ABCDEF', 'title', 5)
96
+ c_2 = Fragment.new('GHIJKL', 'title', 11)
89
97
 
90
98
  assert(! c_1.overlap?(c_2), 'Overlap 2/2')
91
99
  assert(! c_2.overlap?(c_1), 'Overlap 2/1')
92
100
  assert(c_1.touch?(c_2), 'Touch 2/1')
93
101
  assert(c_2.touch?(c_1), 'Touch 2/2')
94
102
 
95
- c_1 = QDA::Fragment.new('ABCDEF', 'title', 5)
96
- c_2 = QDA::Fragment.new('JKL', 'title', 14)
103
+ c_1 = Fragment.new('ABCDEF', 'title', 5)
104
+ c_2 = Fragment.new('JKL', 'title', 14)
97
105
  assert(! c_1.overlap?(c_2), 'Overlap 3/2')
98
106
  assert(! c_2.overlap?(c_1), 'Overlap 3/1')
99
107
  assert(! c_1.touch?(c_2), 'Touch 3/1')
@@ -101,27 +109,27 @@ class TestDocument < Test::Unit::TestCase
101
109
  end
102
110
 
103
111
  def test_fragment_comparison
104
- c_1 = QDA::Fragment.new('ABC', 'title', 5)
105
- c_2 = QDA::Fragment.new('XYZ', 'title', 0)
112
+ c_1 = Fragment.new('ABC', 'title', 5)
113
+ c_2 = Fragment.new('XYZ', 'title', 0)
106
114
  assert(c_2 < c_1, 'Offset comparison')
107
115
 
108
- cs = QDA::CodeSet[ c_1, c_2 ]
116
+ cs = CodeSet[ c_1, c_2 ]
109
117
  cs = cs.sort { | x, y | x <=> y }
110
118
  assert_equal('XYZ', cs[0],
111
119
  'Sort test')
112
120
 
113
- c_1 = QDA::Fragment.new('abc', 'title', 0)
114
- c_2 = QDA::Fragment.new('xyz', 'title', 5)
121
+ c_1 = Fragment.new('abc', 'title', 0)
122
+ c_2 = Fragment.new('xyz', 'title', 5)
115
123
  assert(c_2 > c_1, 'Offset comparison')
116
124
 
117
- cs = QDA::CodeSet[ c_1, c_2 ]
125
+ cs = CodeSet[ c_1, c_2 ]
118
126
  cs = cs.sort
119
127
  assert_equal('abc', cs[0],
120
128
  'Sort test')
121
129
  end
122
130
 
123
131
  def test_fragment_addition
124
- d = QDA::Document.new('The Title')
132
+ d = Document.new('The Title')
125
133
  d.append('abc def ghi jkl')
126
134
  d.append('ABC DEF GHI JKL')
127
135
  fr_1 = d[0,4]
@@ -137,8 +145,8 @@ class TestDocument < Test::Unit::TestCase
137
145
  assert_equal('abc ', fr_1 + d[1,2],
138
146
  'Surrounded fragment addition')
139
147
 
140
- cs_1 = QDA::CodeSet[ fr_1, fr_3 ]
141
- cs_2 = QDA::CodeSet[ d[3, 11] ]
148
+ cs_1 = CodeSet[ fr_1, fr_3 ]
149
+ cs_2 = CodeSet[ d[3, 11] ]
142
150
 
143
151
  results = cs_1.union(cs_2)
144
152
  assert_equal( [ d[0, 18 ] ], results,
@@ -150,7 +158,7 @@ class TestDocument < Test::Unit::TestCase
150
158
  end
151
159
 
152
160
  def test_fragment_intersect
153
- d = QDA::Document.new('The Title')
161
+ d = Document.new('The Title')
154
162
  d.append('abc def ghi jkl')
155
163
  d.append('ABC DEF GHI JKL')
156
164
  fr_1 = d[0,4]
@@ -167,7 +175,7 @@ class TestDocument < Test::Unit::TestCase
167
175
  end
168
176
 
169
177
  def test_fragment_exclude
170
- d = QDA::Document.new('The Title')
178
+ d = Document.new('The Title')
171
179
  d.append('abc def ghi jkl')
172
180
  d.append('ABC DEF GHI JKL')
173
181
  fr_1 = d[0,4]
@@ -182,8 +190,8 @@ class TestDocument < Test::Unit::TestCase
182
190
  assert_equal([ 'a', ' ' ], fr_1 - d[1,2],
183
191
  'overlapping fragment exclusion')
184
192
 
185
- cs_1 = QDA::CodeSet[ fr_1, fr_3 ]
186
- cs_2 = QDA::CodeSet[ d[3, 11] ]
193
+ cs_1 = CodeSet[ fr_1, fr_3 ]
194
+ cs_2 = CodeSet[ d[3, 11] ]
187
195
 
188
196
  results = cs_1.exclude(cs_2)
189
197
  assert_equal( [ d[0,3], d[14, 4] ], results,
@@ -193,4 +201,15 @@ class TestDocument < Test::Unit::TestCase
193
201
  assert_equal( [ d[0,3], d[14, 4] ], results,
194
202
  'CodeSet subtraction')
195
203
  end
204
+
205
+ def test_match
206
+ d = Document.new('')
207
+ d.append('abc def ghi jkl')
208
+ d.append('ABC DEF GHI JKL')
209
+
210
+ d.scan(/\w\w\w/) do | match |
211
+ assert_kind_of(Fragment, match)
212
+ assert_equal( match.offset, d.text.index(match.to_s) )
213
+ end
214
+ end
196
215
  end
@@ -1,11 +1,11 @@
1
- require 'english'
2
-
3
- $:.push('../lib/')
1
+ require 'test-common'
4
2
 
3
+ require 'weft/exceptions'
5
4
  require 'weft/category'
6
5
  require 'test/unit'
7
6
 
8
- class TestDocument < Test::Unit::TestCase
7
+ class TestCategory < Test::Unit::TestCase
8
+ include QDA
9
9
  def setup
10
10
 
11
11
  end
@@ -16,10 +16,42 @@ class TestDocument < Test::Unit::TestCase
16
16
  'Set title at initialisation')
17
17
  assert_equal(0, c.children.length,
18
18
  'Empty at initialisation')
19
-
20
- c2 = QDA::Category.new('Child Node',c)
19
+ assert_nil(c.codes)
20
+
21
+ c2 = QDA::Category.new('Child Node', c)
22
+
21
23
  assert_equal(1, c.children.length,
22
24
  'Added a child')
25
+ assert( c2.is_descendant_of?(c) )
26
+ assert( ! c2.is_ancestor_of?(c) )
27
+ assert( c.is_ancestor_of?(c2) )
28
+ assert( ! c.is_descendant_of?(c2) )
29
+ assert_equal( c2, c['Child Node'])
30
+ assert_equal( c2, c[/ild No/])
31
+ assert_equal( nil, c[2] )
32
+
33
+
34
+ c3 = QDA::Category.new('Child / Node',c)
35
+ assert_equal('Child / Node', c3.name)
36
+ assert_equal('Child // Node', c3.escape_name)
37
+ assert( c.is_ancestor_of?(c3) )
38
+ assert( ! c2.is_ancestor_of?(c3) )
39
+ assert( ! c2.is_descendant_of?(c3) )
40
+
41
+ assert_equal(2, c.children.length)
42
+ assert_equal([c2, c3], c.children)
43
+
44
+ assert_raises(QDA::BadNameError) { QDA::Category.new('/Bad Name', c) }
45
+ assert_raises(QDA::BadNameError) { QDA::Category.new('Bad Name/', c) }
46
+
47
+ c4 = QDA::Category.new('NAME', c)
48
+ assert_raises(QDA::NotUniqueNameError) { QDA::Category.new('NAME', c) }
49
+ assert_raises(QDA::NotUniqueNameError) { QDA::Category.new('name', c) }
50
+ rename = c.unique_name('NAME')
51
+ assert_equal('NAME (1)', rename)
52
+ c5 = QDA::Category.new(rename, c)
53
+ rename = c.unique_name('NAME')
54
+ assert_equal('NAME (2)', rename)
23
55
  end
24
56
 
25
57
  def test_memo
@@ -135,4 +167,47 @@ class TestDocument < Test::Unit::TestCase
135
167
 
136
168
  # more tests ? ... seems to be all OK, not
137
169
  end
170
+
171
+ def test_paths()
172
+ bits = Category.parse_path('foo')
173
+ assert_equal(1, bits.length)
174
+
175
+ bits = Category.parse_path('fo//o/x/c')
176
+ assert_equal(3, bits.length)
177
+ assert_equal('fo/o', bits[0])
178
+
179
+ bits = Category.parse_path('fo/o')
180
+ assert_equal(2, bits.length)
181
+
182
+ bits = Category.parse_path('//foo')
183
+ assert_equal(1, bits.length)
184
+ assert_equal('/foo', bits[0])
185
+
186
+ bits = Category.parse_path('foo//')
187
+ assert_equal(1, bits.length)
188
+ assert_equal('foo/', bits[0])
189
+
190
+ bits = Category.parse_path('///')
191
+ assert_equal(1, bits.length)
192
+ assert_equal('/', bits[0])
193
+
194
+ bits = Category.parse_path('/aaa')
195
+ assert_equal(2, bits.length)
196
+ assert_equal('', bits[0])
197
+
198
+ c1 = QDA::Category.new('The Title', nil)
199
+ assert_equal('/The Title', c1.path)
200
+ c2 = QDA::Category.new('Child Node',c1)
201
+ assert_equal('/The Title/Child Node', c2.path)
202
+ c3 = QDA::Category.new('This / That', c2)
203
+ assert_equal('/The Title/Child Node/This // That', c3.path)
204
+
205
+ desc = c1.descendants()
206
+ assert(desc.include?(c2))
207
+ assert(desc.include?(c3))
208
+
209
+ anc = c2.ancestors()
210
+ assert(anc.include?(c1))
211
+ assert(! anc.include?(c3))
212
+ end
138
213
  end
@@ -1,6 +1,4 @@
1
- require 'english'
2
-
3
- $:.push('../lib/')
1
+ require 'test-common'
4
2
 
5
3
  require 'weft'
6
4
  require 'test/unit'
@@ -335,6 +333,9 @@ class TestCode < Test::Unit::TestCase
335
333
  assert_equal(1, tbl.num_of_docs)
336
334
  assert_equal(6, tbl.num_of_chars)
337
335
  assert_equal(1, tbl.num_of_codes)
336
+
337
+ sets = tbl.sets
338
+ assert_equal(1, sets.length)
338
339
  end
339
340
 
340
341
  def test_fragment_table
@@ -344,12 +345,15 @@ class TestCode < Test::Unit::TestCase
344
345
  assert_equal(1, ft.num_of_docs)
345
346
  assert_equal(8, ft.num_of_chars)
346
347
  assert_equal(1, ft.num_of_codes)
348
+ sets = ft.sets
349
+ assert_equal(1, sets.length)
350
+ assert_equal(1, sets[0].length)
351
+
347
352
  ft.each_title do | title, codes |
348
353
  assert_equal('title', title)
349
354
  assert_equal(1, codes.length)
350
355
  end
351
356
 
352
-
353
357
  ct = ft.to_codingtable()
354
358
  assert_equal(1, ct.num_of_docs)
355
359
  assert_equal(8, ct.num_of_chars)
@@ -1,18 +1,21 @@
1
- $:.push('../lib/')
1
+ require 'test-common'
2
2
 
3
3
  require 'weft/application'
4
+ require 'weft/broadcaster'
5
+
4
6
  require 'test/unit'
5
7
 
6
8
  class DummyClient
7
- attr_reader :state_display
8
-
9
+ attr_reader :event_log
10
+ include QDA::Subscriber
11
+
9
12
  def initialize(app = nil)
10
- app.add_observer(self) if app
11
- @state_display = "CLEAN"
13
+ @event_log
14
+ subscribe(app, :all)
12
15
  end
13
-
14
- def update(state)
15
- @state_display = state ? "DIRTY" : "CLEAN"
16
+
17
+ def notify(evt, data)
18
+ event_log.push( :evt => evt, :data => data )
16
19
  end
17
20
  end
18
21
 
@@ -22,31 +25,7 @@ class TestApplication < Test::Unit::TestCase
22
25
  end
23
26
 
24
27
  def test_basic
25
- app = QDA::Application.new()
28
+ app = QDA::Application.new()
26
29
  client = DummyClient.new(app)
27
- assert_equal("CLEAN", client.state_display,
28
- "Observer initially set to show clean")
29
- app.dirty!
30
- assert_equal("DIRTY", client.state_display,
31
- "Observer picks up dirtying")
32
- app.undirty!
33
- assert_equal("CLEAN", client.state_display,
34
- "Observer picks up saving")
35
-
36
- end
37
-
38
- def test_basic_w_initializer
39
- client = DummyClient.new()
40
- app = QDA::Application.new(client)
41
-
42
- assert_equal("CLEAN", client.state_display,
43
- "Observer initially set to show clean")
44
- app.dirty!
45
- assert_equal("DIRTY", client.state_display,
46
- "Observer picks up dirtying")
47
- app.undirty!
48
- assert_equal("CLEAN", client.state_display,
49
- "Observer picks up saving")
50
-
51
- end
30
+ end
52
31
  end