weft-qda 0.9.6
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.
- data/lib/weft.rb +21 -0
- data/lib/weft/WEFT-VERSION-STRING.rb +1 -0
- data/lib/weft/application.rb +130 -0
- data/lib/weft/backend.rb +39 -0
- data/lib/weft/backend/marshal.rb +26 -0
- data/lib/weft/backend/mysql.rb +267 -0
- data/lib/weft/backend/n6.rb +366 -0
- data/lib/weft/backend/sqlite.rb +633 -0
- data/lib/weft/backend/sqlite/category_tree.rb +104 -0
- data/lib/weft/backend/sqlite/schema.rb +152 -0
- data/lib/weft/backend/sqlite/upgradeable.rb +55 -0
- data/lib/weft/category.rb +157 -0
- data/lib/weft/coding.rb +355 -0
- data/lib/weft/document.rb +118 -0
- data/lib/weft/filters.rb +243 -0
- data/lib/weft/wxgui.rb +687 -0
- data/lib/weft/wxgui/category.xpm +26 -0
- data/lib/weft/wxgui/dialogs.rb +128 -0
- data/lib/weft/wxgui/document.xpm +25 -0
- data/lib/weft/wxgui/error_handler.rb +52 -0
- data/lib/weft/wxgui/inspectors.rb +361 -0
- data/lib/weft/wxgui/inspectors/category.rb +165 -0
- data/lib/weft/wxgui/inspectors/codereview.rb +275 -0
- data/lib/weft/wxgui/inspectors/document.rb +139 -0
- data/lib/weft/wxgui/inspectors/imagedocument.rb +56 -0
- data/lib/weft/wxgui/inspectors/script.rb +35 -0
- data/lib/weft/wxgui/inspectors/search.rb +265 -0
- data/lib/weft/wxgui/inspectors/textcontrols.rb +304 -0
- data/lib/weft/wxgui/lang.rb +17 -0
- data/lib/weft/wxgui/lang/en.rb +45 -0
- data/lib/weft/wxgui/mondrian.xpm +44 -0
- data/lib/weft/wxgui/search.xpm +25 -0
- data/lib/weft/wxgui/sidebar.rb +498 -0
- data/lib/weft/wxgui/utilities.rb +148 -0
- data/lib/weft/wxgui/weft16.xpm +31 -0
- data/lib/weft/wxgui/workarea.rb +249 -0
- data/test/001-document.rb +196 -0
- data/test/002-category.rb +138 -0
- data/test/003-code.rb +370 -0
- data/test/004-application.rb +52 -0
- data/test/006-filters.rb +139 -0
- data/test/009a-backend_sqlite_basic.rb +280 -0
- data/test/009b-backend_sqlite_complex.rb +175 -0
- data/test/009c_backend_sqlite_bench.rb +81 -0
- data/test/010-backend_nudist.rb +5 -0
- data/test/all-tests.rb +1 -0
- data/test/manual-gui-script.txt +24 -0
- data/test/testdata/autocoding-test.txt +15 -0
- data/test/testdata/iso-8859-1.txt +5 -0
- data/test/testdata/sample_doc.txt +19 -0
- data/test/testdata/search_results.txt +1254 -0
- data/test/testdata/text1-dos-ascii.txt +2 -0
- data/test/testdata/text1-unix-utf8.txt +2 -0
- data/weft-qda.rb +28 -0
- metadata +96 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
$:.push('../lib/')
|
2
|
+
|
3
|
+
require 'weft/application'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class DummyClient
|
7
|
+
attr_reader :state_display
|
8
|
+
|
9
|
+
def initialize(app = nil)
|
10
|
+
app.add_observer(self) if app
|
11
|
+
@state_display = "CLEAN"
|
12
|
+
end
|
13
|
+
|
14
|
+
def update(state)
|
15
|
+
@state_display = state ? "DIRTY" : "CLEAN"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TestApplication < Test::Unit::TestCase
|
20
|
+
def setup
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_basic
|
25
|
+
app = QDA::Application.new()
|
26
|
+
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
|
52
|
+
end
|
data/test/006-filters.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'english'
|
2
|
+
|
3
|
+
$:.push('../lib/')
|
4
|
+
|
5
|
+
require 'weft/application'
|
6
|
+
require 'weft/backend'
|
7
|
+
require 'weft/document'
|
8
|
+
require 'weft/filters'
|
9
|
+
|
10
|
+
require 'test/unit'
|
11
|
+
|
12
|
+
class TestFilter < Test::Unit::TestCase
|
13
|
+
def sample_file(filename)
|
14
|
+
File.join( File.dirname( __FILE__), 'testdata', filename)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_unix_utf8()
|
18
|
+
filter = QDA::TextFilter.new()
|
19
|
+
doc = filter.read(sample_file('text1-unix-utf8.txt'), 'test-unix-utf8')
|
20
|
+
|
21
|
+
str = "This is a text document\nin unix unicode.\n"
|
22
|
+
assert_equal(str, doc.text, "Document text read in")
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_indexer
|
26
|
+
idx = QDA::Indexer.new()
|
27
|
+
idx.index('foo')
|
28
|
+
|
29
|
+
widx = QDA::WordIndexer.new()
|
30
|
+
my_word = 'SOMETHING'
|
31
|
+
widx.index(my_word)
|
32
|
+
assert_equal(1, widx.words.keys.length)
|
33
|
+
assert_equal(1, widx.words[my_word].length)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_dos_ascii()
|
37
|
+
filter = QDA::TextFilter.new()
|
38
|
+
doc = filter.read(sample_file('text1-dos-ascii.txt'), 'test-ascii')
|
39
|
+
|
40
|
+
str = "This is a text document\nin dos ascii.\n"
|
41
|
+
assert_equal(str, doc.text, "Document text read in")
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_pdf
|
45
|
+
filter = QDA::PDFFilter.new()
|
46
|
+
windxr = QDA::WordIndexer.new()
|
47
|
+
filter.add_indexer(windxr)
|
48
|
+
doc = filter.read('testdata/emacs-refcard-a4.pdf', 'i')
|
49
|
+
|
50
|
+
doc.title = 'Acknowledgments'
|
51
|
+
word = 'moving'
|
52
|
+
windxr.words.each do | word, offsets |
|
53
|
+
offsets.each do | offset |
|
54
|
+
assert_equal( word, doc[offset, word.length] )
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_word_indexing()
|
60
|
+
filter = QDA::TextFilter.new()
|
61
|
+
windxr = QDA::WordIndexer.new()
|
62
|
+
filter.add_indexer(windxr)
|
63
|
+
doc = filter.read(sample_file('autocoding-test.txt'),
|
64
|
+
'word_indexing')
|
65
|
+
# ordinary, capitalised, short, apostrophe, longer
|
66
|
+
test_words = [ 'the', 'Before', 'I', 'It\'s', 'opinions' ]
|
67
|
+
test_words.each do | test_word |
|
68
|
+
windxr.words[test_word].each do | loc |
|
69
|
+
assert_equal(test_word, doc.text[loc, test_word.length].to_s)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_indexing_iso_8859_1
|
75
|
+
filter = QDA::TextFilter.new()
|
76
|
+
windxr = QDA::WordIndexer.new()
|
77
|
+
filter.add_indexer(windxr)
|
78
|
+
doc = filter.read(sample_file('iso-8859-1.txt'), 'iso-8859-1')
|
79
|
+
word_rx = /[\w\xC0-\xD6\xD8-\xF6\xF8-\xFF][\w\xC0-\xD6\xD8-\xF6\xF8-\xFF\']+/
|
80
|
+
windxr.words.each_key do | word |
|
81
|
+
assert_match(word_rx, word)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_autocoding
|
86
|
+
filter = QDA::TextFilter.new()
|
87
|
+
autocoder = QDA::AutoCoder.new(/^\*\*(.*)\*\*\s*$/ => 'Heading',
|
88
|
+
/^(.*)\:\s*$/ => 'Speaker')
|
89
|
+
filter.add_indexer(autocoder)
|
90
|
+
|
91
|
+
doc = filter.read(sample_file('autocoding-test.txt'),
|
92
|
+
'autocoding')
|
93
|
+
|
94
|
+
str = "Before any autocoding\n\nSpeakerA:\nI am the first speaker.\nThis is what I say.\n\n**A TEXT HEADER**\n\nSpeakerB:\nI am the second speaker.\n\nThis is what I say. It's my opinions.\n\nSpeakerA:\nMe again.\n"
|
95
|
+
assert_equal(str, doc.text)
|
96
|
+
autocodes = autocoder.codes
|
97
|
+
assert_equal(2, autocodes.keys.length,
|
98
|
+
"Number of autocode types created")
|
99
|
+
|
100
|
+
speaker_a = autocodes['Speaker']['SpeakerA']
|
101
|
+
assert_instance_of(QDA::CodeSet, speaker_a,
|
102
|
+
"Autocode speaker A category created")
|
103
|
+
assert_equal(2, speaker_a.length, "Multiple passages coded")
|
104
|
+
# assert_equal(1, speaker_a.num_of_docs, "Single document coded")
|
105
|
+
content_a_1 =
|
106
|
+
"SpeakerA:
|
107
|
+
I am the first speaker.
|
108
|
+
This is what I say.
|
109
|
+
|
110
|
+
**A TEXT HEADER**
|
111
|
+
|
112
|
+
"
|
113
|
+
assert_equal(content_a_1,
|
114
|
+
doc.text[speaker_a[0].offset, speaker_a[0].length],
|
115
|
+
"Document text retrievable by code" )
|
116
|
+
|
117
|
+
speaker_b = autocodes['Speaker']['SpeakerB']
|
118
|
+
assert_instance_of(QDA::CodeSet, speaker_b,
|
119
|
+
"Autocode speaker B category created")
|
120
|
+
|
121
|
+
heading_1 = autocodes['Heading']['A TEXT HEADER']
|
122
|
+
assert_instance_of(QDA::CodeSet, heading_1,
|
123
|
+
"Autocode heading category created")
|
124
|
+
|
125
|
+
header_extract = "**A TEXT HEADER**
|
126
|
+
|
127
|
+
SpeakerB:
|
128
|
+
I am the second speaker.
|
129
|
+
|
130
|
+
This is what I say. It's my opinions.
|
131
|
+
|
132
|
+
SpeakerA:
|
133
|
+
Me again.
|
134
|
+
"
|
135
|
+
assert_equal(header_extract,
|
136
|
+
doc.text[heading_1[0].offset, heading_1[0].length],
|
137
|
+
"Document text retrievable by code" )
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,280 @@
|
|
1
|
+
require 'english'
|
2
|
+
$:.push('../lib/')
|
3
|
+
|
4
|
+
require 'weft'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
class TestSQLiteBasic < Test::Unit::TestCase
|
8
|
+
def sample_file(filename)
|
9
|
+
File.join( File.dirname( __FILE__), 'testdata', filename)
|
10
|
+
end
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@dbfile = nil
|
14
|
+
@app = QDA::Application.new()
|
15
|
+
@app.extend(QDA::Backend::SQLite)
|
16
|
+
end
|
17
|
+
|
18
|
+
# delete any files hanging around
|
19
|
+
def teardown()
|
20
|
+
if @app.started?
|
21
|
+
# p @app
|
22
|
+
# @app.end()
|
23
|
+
if @app.dbfile and File.exist?(@app.dbfile)
|
24
|
+
File.delete(@app.dbfile)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# test save & revert
|
30
|
+
def test_statefulness
|
31
|
+
@app.start(:dbfile => @dbfile)
|
32
|
+
@app.install_clean()
|
33
|
+
doc = QDA::Document.new('Doc-1')
|
34
|
+
@app.save_document(doc)
|
35
|
+
|
36
|
+
assert_raises(RuntimeError, "Cannot save without a filename") do
|
37
|
+
doc = @app.save()
|
38
|
+
end
|
39
|
+
|
40
|
+
@dbfile = 'foo.db'
|
41
|
+
|
42
|
+
@app.save(@dbfile)
|
43
|
+
assert(File.exist?(@dbfile), "File created after save")
|
44
|
+
assert(@app.get_doc('Doc-1'), "Still has saved content - new filename")
|
45
|
+
|
46
|
+
doc = QDA::Document.new('Doc-2')
|
47
|
+
@app.save_document(doc)
|
48
|
+
@app.save
|
49
|
+
assert(@app.get_doc('Doc-2'), "Still has saved content - re-use filename")
|
50
|
+
|
51
|
+
doc = QDA::Document.new('Doc-3')
|
52
|
+
@app.save_document(doc)
|
53
|
+
@app.revert
|
54
|
+
assert(File.exist?(@dbfile), "File exists after revert")
|
55
|
+
|
56
|
+
assert(@app.get_doc('Doc-1'), "Still has last-saved content")
|
57
|
+
assert(@app.get_doc('Doc-2'), "Still has last-saved content")
|
58
|
+
assert_raises(RuntimeError, "Lost unsaved content") do
|
59
|
+
doc = @app.get_doc('Doc-3')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_open_file
|
64
|
+
@app.start(:dbfile => @dbfile)
|
65
|
+
@app.install_clean()
|
66
|
+
@app.set_up()
|
67
|
+
|
68
|
+
# this will save in current working directory
|
69
|
+
@app.save('foo.db')
|
70
|
+
@app.end
|
71
|
+
|
72
|
+
@app.start(:dbfile => File::join(Dir.pwd, 'foo.db') )
|
73
|
+
File.unlink(File::join(Dir.pwd, 'foo.db'))
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_basic_save_and_get_document()
|
77
|
+
@app.start(:dbfile => @dbfile)
|
78
|
+
@app.install_clean()
|
79
|
+
doc = QDA::Document.new('About Something')
|
80
|
+
assert_nil(doc.dbid, "No DBID set")
|
81
|
+
@app.save_document(doc)
|
82
|
+
assert(doc.dbid, 'Got a DBID set')
|
83
|
+
|
84
|
+
fetch_doc = @app.get_doc(doc.dbid)
|
85
|
+
assert(fetch_doc, "Got something back")
|
86
|
+
|
87
|
+
assert_equal(doc.dbid, fetch_doc.dbid,
|
88
|
+
"Fetched back thing has the same dbid")
|
89
|
+
assert_equal(doc.title, fetch_doc.title,
|
90
|
+
"Fetched back thing has the same dbid")
|
91
|
+
|
92
|
+
fetch_doc = @app.get_doc(doc.title)
|
93
|
+
assert(fetch_doc, "Got something back")
|
94
|
+
|
95
|
+
assert_equal(doc.dbid, fetch_doc.dbid,
|
96
|
+
"Fetched back thing has the same dbid")
|
97
|
+
assert_equal(doc.title, fetch_doc.title,
|
98
|
+
"Fetched back thing has the same dbid")
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_save_and_get_document_content()
|
102
|
+
@app.start(:dbfile => @dbfile)
|
103
|
+
@app.install_clean()
|
104
|
+
doc = QDA::Document.new('About Something')
|
105
|
+
str1 = 'fo"o'
|
106
|
+
doc.append(str1)
|
107
|
+
str2 = "fo'o"
|
108
|
+
doc.append(str2)
|
109
|
+
|
110
|
+
@app.save_document(doc)
|
111
|
+
assert(doc.dbid, 'Got a DBID set')
|
112
|
+
|
113
|
+
fetch_doc = @app.get_doc(doc.dbid)
|
114
|
+
assert(fetch_doc, "Got something back")
|
115
|
+
assert_equal("fo\"o", fetch_doc[0,4],
|
116
|
+
"Got some fragments back")
|
117
|
+
assert_equal("fo'o\n", fetch_doc[5,5],
|
118
|
+
"Got some fragments back")
|
119
|
+
|
120
|
+
#assert_equal(2, fetch_doc.fragments.length,
|
121
|
+
#"Got some fragments back")
|
122
|
+
#assert_equal(str1, fetch_doc.fragments[0].text,
|
123
|
+
#"Got single-quote fragment back")
|
124
|
+
#assert_equal(str2, fetch_doc.fragments[1].text,
|
125
|
+
#"Got double-quote fragment back")
|
126
|
+
@app.save_document(doc)
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_save_category_with_code()
|
130
|
+
@app.start(:dbfile => @dbfile)
|
131
|
+
@app.install_clean()
|
132
|
+
cat1 = QDA::Category.new("About 'Something'", nil, 'A memo')
|
133
|
+
|
134
|
+
doc = QDA::Document.new('Hello')
|
135
|
+
doc.append('this')
|
136
|
+
doc.append('that')
|
137
|
+
@app.save_document(doc)
|
138
|
+
|
139
|
+
# code 6 characters starting at index 1
|
140
|
+
cat1.code(doc.dbid, 1, 6)
|
141
|
+
|
142
|
+
@app.save_category(cat1)
|
143
|
+
|
144
|
+
f_cat1 = @app.get_category(cat1.dbid)
|
145
|
+
assert_equal(1, f_cat1.num_of_docs,
|
146
|
+
'Have coded 1 doc')
|
147
|
+
assert_equal(1, f_cat1.num_of_codes,
|
148
|
+
'Have applied one vector')
|
149
|
+
assert_equal(6, f_cat1.num_of_chars,
|
150
|
+
'Have coded 6 characters')
|
151
|
+
|
152
|
+
texts = @app.get_text_at_category(cat1)
|
153
|
+
|
154
|
+
assert_equal(1, texts.keys.length,
|
155
|
+
'Have stored one vector')
|
156
|
+
assert_equal("his\nth", texts[doc.title][0],
|
157
|
+
'Have retrieved text')
|
158
|
+
assert_equal(1, texts[doc.title][0].offset,
|
159
|
+
'Have retrieved text offset')
|
160
|
+
assert_equal(6, texts[doc.title][0].length,
|
161
|
+
'Have retrieved text length')
|
162
|
+
assert(texts[doc.title][0].docid,
|
163
|
+
'Have retrieved docid')
|
164
|
+
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_basic_save_category
|
169
|
+
@app.start(:dbfile => @dbfile)
|
170
|
+
@app.install_clean()
|
171
|
+
cat1 = QDA::Category.new("About 'Something'", nil, 'the "memo"')
|
172
|
+
|
173
|
+
@app.save_category(cat1)
|
174
|
+
assert(cat1.dbid, 'Category was assigned a database id')
|
175
|
+
|
176
|
+
f_cat1 = @app.get_category(cat1.dbid)
|
177
|
+
assert_equal(cat1.name, f_cat1.name,
|
178
|
+
"Name retrieved successfully")
|
179
|
+
assert_equal(cat1.memo, f_cat1.memo,
|
180
|
+
"Memo retrieved successfully")
|
181
|
+
|
182
|
+
# test some parent-child stuff
|
183
|
+
cat2 = QDA::Category.new('Something "Specific"', cat1)
|
184
|
+
@app.save_category(cat2)
|
185
|
+
assert(cat2.dbid, 'Category was assigned a database id')
|
186
|
+
|
187
|
+
cat2a = QDA::Category.new('Something "Specific" & Detailed', cat2)
|
188
|
+
@app.save_category(cat2a)
|
189
|
+
|
190
|
+
cat3 = QDA::Category.new('Something "Else"', cat1)
|
191
|
+
@app.save_category(cat3)
|
192
|
+
|
193
|
+
# @app.dbh.execute("SELECT * FROM category") { | r | p r }
|
194
|
+
f_cat2 = @app.get_category(cat2.dbid)
|
195
|
+
assert_equal(cat2.name, f_cat2.name,
|
196
|
+
"Name retrieved successfully")
|
197
|
+
|
198
|
+
assert_equal(cat2.dbid, f_cat2.dbid,
|
199
|
+
"DBID retrieved successfully")
|
200
|
+
|
201
|
+
p_cat = @app.get_category(cat2.parent.dbid)
|
202
|
+
assert_equal(p_cat.dbid, cat1.dbid,
|
203
|
+
"Parent retrieved successfully")
|
204
|
+
|
205
|
+
assert_nil(@app.get_category_parent(p_cat.dbid),
|
206
|
+
"Nil retrieved for root node's parent")
|
207
|
+
|
208
|
+
roots = @app.get_all_categories()
|
209
|
+
|
210
|
+
assert_equal(1, roots.length,
|
211
|
+
"Root elements retrieved successfully")
|
212
|
+
assert_equal("About 'Something'", roots[0].name,
|
213
|
+
"Root element retrieved successfully")
|
214
|
+
assert_equal(2, roots[0].children.length,
|
215
|
+
"Root element children retrieved successfully")
|
216
|
+
|
217
|
+
cat3 = QDA::Category.new("NEw root node", nil)
|
218
|
+
@app.save_category(cat3)
|
219
|
+
|
220
|
+
roots = @app.get_all_categories()
|
221
|
+
assert_equal(2, roots.length,
|
222
|
+
"Multiple Root elements retrieved successfully")
|
223
|
+
|
224
|
+
new_root = @app.get_root_category("NEw root node")
|
225
|
+
assert_equal(QDA::Category, new_root.class)
|
226
|
+
assert_equal("NEw root node", new_root.name)
|
227
|
+
assert_equal(nil, new_root.parent)
|
228
|
+
assert_raises(RuntimeError) { @app.get_root_category("Doesn't exist") }
|
229
|
+
|
230
|
+
|
231
|
+
finds = @app.get_categories_by_path('Something')
|
232
|
+
assert_equal(3, finds.length, 'Normal name/path search')
|
233
|
+
|
234
|
+
finds = @app.get_categories_by_path('something')
|
235
|
+
assert_equal(3, finds.length, 'Case insensitive name/path search')
|
236
|
+
|
237
|
+
finds = @app.get_categories_by_path('Something/Something')
|
238
|
+
assert_equal(1, finds.length)
|
239
|
+
|
240
|
+
finds = @app.get_categories_by_path('Fake/Bad')
|
241
|
+
assert_equal(0, finds.length)
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_cut_paste_category
|
245
|
+
@app.start(:dbfile => @dbfile)
|
246
|
+
@app.install_clean()
|
247
|
+
cat1 = QDA::Category.new("About 'Something'", nil)
|
248
|
+
@app.save_category(cat1)
|
249
|
+
|
250
|
+
cat2 = QDA::Category.new('Something "Specific"', cat1)
|
251
|
+
@app.save_category(cat2)
|
252
|
+
cat2a = QDA::Category.new('Something "Specific" & Detailed', cat2)
|
253
|
+
@app.save_category(cat2a)
|
254
|
+
cat3 = QDA::Category.new('Something "Else"', cat1)
|
255
|
+
@app.save_category(cat3)
|
256
|
+
cat4 = QDA::Category.new('Something "Again"', cat1)
|
257
|
+
@app.save_category(cat4)
|
258
|
+
|
259
|
+
|
260
|
+
cat2.parent = cat3
|
261
|
+
@app.save_category(cat2)
|
262
|
+
|
263
|
+
|
264
|
+
cat4.parent = cat3
|
265
|
+
@app.save_category(cat4)
|
266
|
+
|
267
|
+
cat2.parent = cat1
|
268
|
+
@app.save_category(cat2)
|
269
|
+
|
270
|
+
deletions = @app.delete_category(cat3)
|
271
|
+
assert_kind_of(Array, deletions)
|
272
|
+
assert_equal(2, deletions.length)
|
273
|
+
end
|
274
|
+
|
275
|
+
def test_install()
|
276
|
+
@app.start(:dbfile => @dbfile)
|
277
|
+
@app.install_clean()
|
278
|
+
assert_raises(RuntimeError) { doc = @app.get_doc('foo') }
|
279
|
+
end
|
280
|
+
end
|