git-ds 0.9.2
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/README.rdoc +795 -0
- data/doc/Examples.rdoc +36 -0
- data/doc/examples/key_value/kv_get.rb +29 -0
- data/doc/examples/key_value/kv_init.rb +20 -0
- data/doc/examples/key_value/kv_list.rb +28 -0
- data/doc/examples/key_value/kv_remove.rb +29 -0
- data/doc/examples/key_value/kv_set.rb +39 -0
- data/doc/examples/key_value/model.rb +156 -0
- data/doc/examples/key_value/test.rb +50 -0
- data/doc/examples/test_suite/model.rb +503 -0
- data/doc/examples/test_suite/test.rb +173 -0
- data/doc/examples/test_suite/ts_add_bug.rb +65 -0
- data/doc/examples/test_suite/ts_add_module.rb +74 -0
- data/doc/examples/test_suite/ts_add_module_to_test.rb +78 -0
- data/doc/examples/test_suite/ts_add_test.rb +77 -0
- data/doc/examples/test_suite/ts_add_test_suite.rb +65 -0
- data/doc/examples/test_suite/ts_add_test_to_bug.rb +76 -0
- data/doc/examples/test_suite/ts_init.rb +20 -0
- data/doc/examples/test_suite/ts_list.rb +118 -0
- data/doc/examples/test_suite/ts_perform_test.rb +104 -0
- data/doc/examples/test_suite/ts_update_bugs.rb +58 -0
- data/doc/examples/user_group/model.rb +265 -0
- data/doc/examples/user_group/test.rb +64 -0
- data/doc/examples/user_group/ug_add_group.rb +39 -0
- data/doc/examples/user_group/ug_add_group_user.rb +36 -0
- data/doc/examples/user_group/ug_add_user.rb +39 -0
- data/doc/examples/user_group/ug_init.rb +20 -0
- data/doc/examples/user_group/ug_list.rb +32 -0
- data/lib/git-ds.rb +14 -0
- data/lib/git-ds/config.rb +53 -0
- data/lib/git-ds/database.rb +289 -0
- data/lib/git-ds/exec_cmd.rb +107 -0
- data/lib/git-ds/index.rb +205 -0
- data/lib/git-ds/model.rb +136 -0
- data/lib/git-ds/model/db_item.rb +42 -0
- data/lib/git-ds/model/fs_item.rb +51 -0
- data/lib/git-ds/model/item.rb +428 -0
- data/lib/git-ds/model/item_list.rb +97 -0
- data/lib/git-ds/model/item_proxy.rb +128 -0
- data/lib/git-ds/model/property.rb +144 -0
- data/lib/git-ds/model/root.rb +46 -0
- data/lib/git-ds/repo.rb +455 -0
- data/lib/git-ds/shared.rb +17 -0
- data/lib/git-ds/transaction.rb +77 -0
- data/tests/ut_database.rb +304 -0
- data/tests/ut_git_grit_equiv.rb +195 -0
- data/tests/ut_index.rb +203 -0
- data/tests/ut_model.rb +360 -0
- data/tests/ut_repo.rb +260 -0
- data/tests/ut_user_group_model.rb +316 -0
- metadata +142 -0
data/tests/ut_index.rb
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright 2011 Thoughtgang <http://www.thoughtgang.org>
|
3
|
+
# Unit test for Git-DS Index class
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
require 'git-ds/repo'
|
9
|
+
require 'git-ds/index'
|
10
|
+
|
11
|
+
class TC_GitIndexTest < Test::Unit::TestCase
|
12
|
+
TMP = File.dirname(__FILE__) + File::SEPARATOR + 'tmp'
|
13
|
+
|
14
|
+
attr_reader :repo
|
15
|
+
|
16
|
+
def setup
|
17
|
+
FileUtils.remove_dir(TMP) if File.exist?(TMP)
|
18
|
+
Dir.mkdir(TMP)
|
19
|
+
path = TMP + File::SEPARATOR + 'index_test'
|
20
|
+
@repo = GitDS::Repo.create(path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown
|
24
|
+
FileUtils.remove_dir(TMP) if File.exist?(TMP)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_index_add_delete
|
28
|
+
name, data = 'test-file-1', '..!!..!!..'
|
29
|
+
|
30
|
+
idx = GitDS::Index.new(@repo)
|
31
|
+
|
32
|
+
# add an item to the index
|
33
|
+
idx.add(name, data)
|
34
|
+
|
35
|
+
# list items in index
|
36
|
+
sha = idx.write
|
37
|
+
t = @repo.git.ruby_git.list_tree(sha)
|
38
|
+
assert_equal( 1, t['blob'].keys.count,
|
39
|
+
'Incorrect Index item count after insert' )
|
40
|
+
assert_equal( name, t['blob'].keys.first, 'Incorrect Index item name')
|
41
|
+
|
42
|
+
# remove an item from the index
|
43
|
+
idx.delete(name)
|
44
|
+
sha = idx.write
|
45
|
+
t = @repo.git.ruby_git.list_tree(sha)
|
46
|
+
assert_equal( 0, t['blob'].keys.count,
|
47
|
+
'Incorrect Index item count after delete' )
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_index_add_fs
|
51
|
+
name, data = 'test/stuff/test-file-fs-1', '-=-=-=-=-='
|
52
|
+
|
53
|
+
idx = GitDS::Index.new(@repo)
|
54
|
+
|
55
|
+
# add an item to the index
|
56
|
+
idx.add(name, data, true)
|
57
|
+
sha = idx.write
|
58
|
+
|
59
|
+
# Verify that item exists in tree
|
60
|
+
t = @repo.git.ruby_git.list_tree(sha)
|
61
|
+
assert( t['tree'].keys.include?('test'),
|
62
|
+
'Tree does not contain object after index-fs-add' )
|
63
|
+
|
64
|
+
# Verify that item exists on disk
|
65
|
+
@repo.exec_in_git_dir {
|
66
|
+
assert( ::File.exist?(name), 'File not exist after index-fs-add' )
|
67
|
+
}
|
68
|
+
|
69
|
+
# verify that deleting removes the file from the FS
|
70
|
+
idx.delete(name)
|
71
|
+
sha = idx.write
|
72
|
+
@repo.exec_in_git_dir {
|
73
|
+
assert( (not ::File.exist?(name)), 'File not exist after index-delete' )
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_index_add_db
|
78
|
+
name, data = 'test/stuff/test-file-db-1', '<><><><><>'
|
79
|
+
|
80
|
+
idx = GitDS::Index.new(@repo)
|
81
|
+
|
82
|
+
# add an item to the index
|
83
|
+
idx.add(name, data)
|
84
|
+
sha = idx.write
|
85
|
+
|
86
|
+
# Verify that item exists in tree
|
87
|
+
t = @repo.git.ruby_git.list_tree(sha)
|
88
|
+
assert( t['tree'].keys.include?('test'),
|
89
|
+
'Tree does not contain object after index-db-add' )
|
90
|
+
|
91
|
+
# Verify that item does not exist on disk
|
92
|
+
@repo.exec_in_git_dir {
|
93
|
+
assert( (not ::File.exist? name), 'File exists after index-db-add' )
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_staging
|
98
|
+
file, data = 'stage-test-1', 'ststststst'
|
99
|
+
idx = GitDS::StageIndex.new(@repo)
|
100
|
+
|
101
|
+
# add a file
|
102
|
+
idx.add(file, data)
|
103
|
+
idx.build
|
104
|
+
|
105
|
+
# Verify that item exists in index
|
106
|
+
t = @repo.git.ruby_git.list_tree(idx.sha)
|
107
|
+
assert_equal( 1, t['blob'].keys.count,
|
108
|
+
'Incorrect StageIndex item count after insert' )
|
109
|
+
|
110
|
+
# test sync
|
111
|
+
idx.sync
|
112
|
+
@repo.exec_in_git_dir {
|
113
|
+
lines = `git ls-files --stage`.lines
|
114
|
+
item = lines.first.chomp.split(/\s/)[3]
|
115
|
+
assert_equal(1, lines.count, 'Staging sync created wrong # of files')
|
116
|
+
assert_equal(file, item, 'Staging sync added wrong file to index')
|
117
|
+
}
|
118
|
+
|
119
|
+
idx = GitDS::StageIndex.read(@repo)
|
120
|
+
t = @repo.git.ruby_git.list_tree(idx.sha)
|
121
|
+
assert_equal( 1, t['blob'].keys.count,
|
122
|
+
'Incorrect StageIndex item count after read' )
|
123
|
+
|
124
|
+
# insert item with path
|
125
|
+
file, data = 'misc/stuff/stage-test-1', 'dfdfdfdf'
|
126
|
+
idx.add(file, data)
|
127
|
+
idx.build
|
128
|
+
t = @repo.git.ruby_git.list_tree(idx.sha)
|
129
|
+
assert_equal( 1, t['tree'].keys.count,
|
130
|
+
'Incorrect StageIndex item count after path-insert' )
|
131
|
+
|
132
|
+
# test sync
|
133
|
+
idx.sync
|
134
|
+
@repo.exec_in_git_dir {
|
135
|
+
lines = `git ls-files --stage`.lines
|
136
|
+
item = lines.first.chomp.split(/\s/)[3]
|
137
|
+
assert_equal(2, lines.count, 'Staging sync created wrong # of files')
|
138
|
+
assert_equal(file, item, 'Staging sync added wrong file to index')
|
139
|
+
}
|
140
|
+
|
141
|
+
# remove an item from the index
|
142
|
+
idx.delete(file)
|
143
|
+
sha = idx.write
|
144
|
+
t = @repo.git.ruby_git.list_tree(sha)
|
145
|
+
assert_equal( 1, t['blob'].keys.count,
|
146
|
+
'Incorrect StageIndex item count after delete' )
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_stage_index_add_fs
|
150
|
+
name, data = 'test/stuff/test-stage-file-fs-1', 'vcvcvcvcvc'
|
151
|
+
|
152
|
+
idx = GitDS::StageIndex.new(@repo)
|
153
|
+
|
154
|
+
# add an item to the index
|
155
|
+
idx.add(name, data, true)
|
156
|
+
sha = idx.write
|
157
|
+
|
158
|
+
# Verify that item exists in tree
|
159
|
+
t = @repo.git.ruby_git.list_tree(sha)
|
160
|
+
assert( t['tree'].keys.include?('test'),
|
161
|
+
'Tree does not contain object after stage-index-fs-add' )
|
162
|
+
|
163
|
+
# Verify that item exists on disk
|
164
|
+
@repo.exec_in_git_dir {
|
165
|
+
assert( ::File.exist?(name), 'File not exist after stage-fs-add' )
|
166
|
+
}
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_stage_index_add_db
|
170
|
+
name, data = 'test/stuff/test-stage-file-db-1', ')()()()()('
|
171
|
+
|
172
|
+
idx = GitDS::StageIndex.new(@repo)
|
173
|
+
|
174
|
+
# add an item to the index
|
175
|
+
idx.add(name, data)
|
176
|
+
sha = idx.write
|
177
|
+
|
178
|
+
# Verify that item exists in tree
|
179
|
+
t = @repo.git.ruby_git.list_tree(sha)
|
180
|
+
assert( t['tree'].keys.include?('test'),
|
181
|
+
'Tree does not contain object after stage-index-db-add' )
|
182
|
+
|
183
|
+
# Verify that item does not exist on disk
|
184
|
+
@repo.exec_in_git_dir {
|
185
|
+
assert( (not ::File.exist? name), 'File exists after stage-db-add' )
|
186
|
+
}
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_stage_commit
|
190
|
+
name, data = 'test/stuff/test-stage-commit-1', 'tlctlctlc'
|
191
|
+
|
192
|
+
idx = GitDS::StageIndex.new(@repo)
|
193
|
+
|
194
|
+
# add an item to the index
|
195
|
+
idx.add(name, data)
|
196
|
+
sha = idx.commit('this is a commit')
|
197
|
+
t = @repo.git.ruby_git.list_tree(@repo.commit(sha).tree.id)
|
198
|
+
assert_equal( 1, t['tree'].keys.count,
|
199
|
+
'Incorrect StageIndex item count after commit' )
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
data/tests/ut_model.rb
ADDED
@@ -0,0 +1,360 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright 2011 Thoughtgang <http://www.thoughtgang.org>
|
3
|
+
# Unit test for Git-DS Model class
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
require 'git-ds/database'
|
9
|
+
require 'git-ds/model'
|
10
|
+
|
11
|
+
|
12
|
+
# =============================================================================
|
13
|
+
# Generic class inheriting ModelItem modules
|
14
|
+
class TestModelItem
|
15
|
+
include GitDS::ModelItemObject
|
16
|
+
extend GitDS::ModelItemClass
|
17
|
+
end
|
18
|
+
|
19
|
+
# ----------------------------------------------------------------------
|
20
|
+
# Generic DB ModelItem
|
21
|
+
|
22
|
+
class TestDbModelItem < GitDS::ModelItem
|
23
|
+
name 'db-test-item'
|
24
|
+
property(:data, 'data')
|
25
|
+
|
26
|
+
def data=(val)
|
27
|
+
set_property(:data, val)
|
28
|
+
end
|
29
|
+
|
30
|
+
# accessors for treatig property value as different types
|
31
|
+
def i_property
|
32
|
+
integer_property(:data)
|
33
|
+
end
|
34
|
+
|
35
|
+
def s_property
|
36
|
+
property(:data)
|
37
|
+
end
|
38
|
+
|
39
|
+
def f_property
|
40
|
+
float_property(:data)
|
41
|
+
end
|
42
|
+
|
43
|
+
def t_property
|
44
|
+
ts_property(:data)
|
45
|
+
end
|
46
|
+
|
47
|
+
def a_property
|
48
|
+
array_property(:data)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
# ----------------------------------------------------------------------
|
54
|
+
# Generic FS ModelItem
|
55
|
+
|
56
|
+
class TestFsModelItem < GitDS::FsModelItem
|
57
|
+
name 'fs-test-item'
|
58
|
+
property(:data, 'data')
|
59
|
+
end
|
60
|
+
|
61
|
+
# =============================================================================
|
62
|
+
class TC_GitModelTest < Test::Unit::TestCase
|
63
|
+
TMP = File.dirname(__FILE__) + File::SEPARATOR + 'tmp'
|
64
|
+
|
65
|
+
attr_reader :db, :model
|
66
|
+
|
67
|
+
def setup
|
68
|
+
FileUtils.remove_dir(TMP) if File.exist?(TMP)
|
69
|
+
Dir.mkdir(TMP)
|
70
|
+
path = TMP + File::SEPARATOR + 'model_test'
|
71
|
+
@db = GitDS::Database.new(path)
|
72
|
+
@model = GitDS::Model.new(@db)
|
73
|
+
end
|
74
|
+
|
75
|
+
def teardown
|
76
|
+
FileUtils.remove_dir(TMP) if File.exist?(TMP)
|
77
|
+
end
|
78
|
+
|
79
|
+
# ----------------------------------------------------------------------
|
80
|
+
|
81
|
+
def test_config
|
82
|
+
assert_equal('', @model.config['the test'], 'Test cfg entry not empty')
|
83
|
+
assert_equal('model-generic.the-test', @model.config.path('the test'),
|
84
|
+
'Config object generated wrong path')
|
85
|
+
@model.config['the test'] = 'zyx'
|
86
|
+
assert_equal('zyx', @model.config['the test'], 'Cfg string incorrect')
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_model_item
|
90
|
+
assert_raises(RuntimeError, 'ModelItemClass has no name defined') {
|
91
|
+
TestModelItem.name
|
92
|
+
}
|
93
|
+
assert_raises(RuntimeError, 'parent is not a ModelItem') {
|
94
|
+
TestModelItem.create("root")
|
95
|
+
}
|
96
|
+
assert_raises(RuntimeError, 'Use Database.root instead of nil for parent') {
|
97
|
+
TestModelItem.create("root")
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
# ----------------------------------------------------------------------
|
102
|
+
def test_db_model_item
|
103
|
+
assert_equal(0, @db.list(TestDbModelItem.path(@model.root)).count,
|
104
|
+
'>0 DbItems in database by default')
|
105
|
+
assert_equal(0, TestDbModelItem.list(@model.root).count,
|
106
|
+
'>0 DbItems in model by default')
|
107
|
+
|
108
|
+
# create an in-DB ModelItem
|
109
|
+
id = '101'
|
110
|
+
data = '00110011'
|
111
|
+
TestDbModelItem.create @model.root, {:ident => id, :data => data }
|
112
|
+
|
113
|
+
# is item in DB?
|
114
|
+
assert_equal(1, @db.list(TestDbModelItem.path(@model.root)).count,
|
115
|
+
'FsModelItem not created in DB')
|
116
|
+
assert_equal(1, TestDbModelItem.list(@model.root).count,
|
117
|
+
'FsModelItem not created in model')
|
118
|
+
# is item NOT on FS?
|
119
|
+
@db.exec_in_git_dir {
|
120
|
+
assert( (not File.exist? TestDbModelItem.name + File::SEPARATOR + id),
|
121
|
+
"TestDbModelItem creates file on disk!")
|
122
|
+
}
|
123
|
+
|
124
|
+
assert_equal(id, TestDbModelItem.list(@model.root).first,
|
125
|
+
'Could not list DbModelItem')
|
126
|
+
|
127
|
+
path = TestDbModelItem.instance_path(@model.root.path, id)
|
128
|
+
o = TestDbModelItem.new(@model, path)
|
129
|
+
assert_equal(id, o.ident, 'Could not insantiate DbModelItem')
|
130
|
+
assert_equal(data, o.property(:data), 'DbModelItem data does not match')
|
131
|
+
|
132
|
+
o.delete
|
133
|
+
assert_equal(0, TestDbModelItem.list(@model.root).count,
|
134
|
+
'DbModelItem delete failed')
|
135
|
+
end
|
136
|
+
|
137
|
+
# ----------------------------------------------------------------------
|
138
|
+
def test_fs_model_item
|
139
|
+
assert_equal(0, @db.list(TestFsModelItem.path(@model.root)).count,
|
140
|
+
'>0 FsItems by default!')
|
141
|
+
assert_equal(0, TestFsModelItem.list(@model.root).count,
|
142
|
+
'>0 FsItems in model by default')
|
143
|
+
|
144
|
+
# create an on-FS ModelItem
|
145
|
+
id = '102'
|
146
|
+
data = '11223344'
|
147
|
+
TestFsModelItem.create @model.root, {:ident => id, :data => data }
|
148
|
+
|
149
|
+
# is item in DB?
|
150
|
+
assert_equal(1, @db.list(TestFsModelItem.path(@model.root)).count,
|
151
|
+
'FsModelItem not created in DB')
|
152
|
+
assert_equal(1, TestFsModelItem.list(@model.root).count,
|
153
|
+
'FsModelItem not created in model')
|
154
|
+
# is item on FS?
|
155
|
+
@db.exec_in_git_dir {
|
156
|
+
assert( (File.exist? TestFsModelItem.name + File::SEPARATOR + id),
|
157
|
+
"TestFsModelItem did not create file on disk")
|
158
|
+
}
|
159
|
+
|
160
|
+
assert_equal(id, TestFsModelItem.list(@model.root).first,
|
161
|
+
'Could not list FsModelItem')
|
162
|
+
|
163
|
+
path = TestFsModelItem.instance_path(@model.root.path, id)
|
164
|
+
o = TestFsModelItem.new(@model, path)
|
165
|
+
assert_equal(id, o.ident, 'Could not insantiate FsModelItem')
|
166
|
+
assert_equal(data, o.property(:data), 'FsModelItem data does not match')
|
167
|
+
|
168
|
+
o.delete
|
169
|
+
assert_equal(0, TestDbModelItem.list(@model.root).count,
|
170
|
+
'DbModelItem delete failed')
|
171
|
+
end
|
172
|
+
|
173
|
+
# ----------------------------------------------------------------------
|
174
|
+
def test_modelitem_list
|
175
|
+
id = ['aa', 'ab', 'ac', 'ad']
|
176
|
+
data = ['10', '11', '12', '13']
|
177
|
+
id.each_with_index do |i, idx|
|
178
|
+
TestDbModelItem.create @model.root, {:ident => i, :data => data[idx] }
|
179
|
+
end
|
180
|
+
|
181
|
+
items = GitDS::ModelItemList.new(TestDbModelItem, @model, @model.root.path)
|
182
|
+
assert_equal(id.count, items.keys.count, 'items list count incorrect')
|
183
|
+
|
184
|
+
o = items[id[1]]
|
185
|
+
assert_equal(id[1], o.ident, 'Could not insantiate FsModelItem')
|
186
|
+
assert_equal(data[1], o.property(:data), 'FsModelItem data does not match')
|
187
|
+
|
188
|
+
new_id = 'ae'
|
189
|
+
new_data = '14'
|
190
|
+
items.add @model.root, {:ident => new_id, :data => new_data }
|
191
|
+
assert_equal(id.count+1, items.keys.count, 'items list count incorrect')
|
192
|
+
|
193
|
+
o = items[new_id]
|
194
|
+
assert_equal(new_id, o.ident, 'Could not insantiate FsModelItem')
|
195
|
+
assert_equal(new_data, o.property(:data), 'FsModelItem data does not match')
|
196
|
+
|
197
|
+
# Test convenience methods
|
198
|
+
assert_equal(id[0], items.first, 'ModelItemList#first failed')
|
199
|
+
assert_equal(new_id, items.last, 'ModelItemList#last failed')
|
200
|
+
assert_equal(items.keys.count, items.count, 'ModelItemList#count failed')
|
201
|
+
|
202
|
+
# Test Enumerable
|
203
|
+
arr = []
|
204
|
+
items.each { |x| arr << x }
|
205
|
+
assert_equal(items.keys, arr, 'ModelItemList#each is broken')
|
206
|
+
assert_equal(items.keys.sort, items.sort, 'ModelItemList#sort failed')
|
207
|
+
assert_equal(id[0], items.min, 'ModelItemList#min failed')
|
208
|
+
assert_equal(id[3], items.reject{ |i| i != id[3] }.first,
|
209
|
+
'ModelItemList#reject failed')
|
210
|
+
assert_equal(id[2], items.select{ |i| i == id[2] }.first,
|
211
|
+
'ModelItemList#select failed')
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_properties
|
215
|
+
props = TestDbModelItem.properties.keys
|
216
|
+
assert_equal(1, props.count, '> 1 property in TestDbModelItem')
|
217
|
+
assert_equal(:data, props.first, ':data property not in TestDbModelItem')
|
218
|
+
|
219
|
+
id, data = 'aAa', 'fubar'
|
220
|
+
TestDbModelItem.create @model.root, {:ident => id, :data => data }
|
221
|
+
|
222
|
+
path = TestDbModelItem.instance_path(@model.root.path, id)
|
223
|
+
o = TestDbModelItem.new(@model, path)
|
224
|
+
|
225
|
+
assert_equal(data, o.s_property, 'String property conversion failed')
|
226
|
+
|
227
|
+
o.data = 378
|
228
|
+
assert_equal(378, o.i_property, 'Integer property conversion failed')
|
229
|
+
|
230
|
+
ts = Time.now
|
231
|
+
o.data = ts
|
232
|
+
assert_equal(ts.to_s, o.t_property.to_s, 'Time property conversion failed')
|
233
|
+
|
234
|
+
o.data = 1.25
|
235
|
+
assert_equal(1.25, o.f_property, 'Float property conversion failed')
|
236
|
+
|
237
|
+
arr = ['a', 'b', 'c']
|
238
|
+
o.data = arr
|
239
|
+
assert_equal(arr, o.a_property, 'String Array property conversion failed')
|
240
|
+
|
241
|
+
arr = [1, 2, 3]
|
242
|
+
o.data = arr
|
243
|
+
assert_equal(arr, o.a_property.map{ |x| x.to_i }, 'Int Array prop failed')
|
244
|
+
|
245
|
+
arr = [1.1, 2.2, 3.3]
|
246
|
+
o.data = arr
|
247
|
+
assert_equal(arr, o.a_property.map{ |x| x.to_f }, 'Float Array prop failed')
|
248
|
+
|
249
|
+
props = o.properties
|
250
|
+
assert_equal(1, props.count, '> 1 property in TestDbModelItem obj')
|
251
|
+
assert_equal(:data, props.first, ':data prop not in TestDbModelItem obj')
|
252
|
+
|
253
|
+
assert_equal(1, o.property_cache.count, 'Incorrect property cache count')
|
254
|
+
o.property_cache.clear()
|
255
|
+
|
256
|
+
assert_equal(0, o.property_cache.count, 'property cache clear failed')
|
257
|
+
|
258
|
+
o.delete
|
259
|
+
|
260
|
+
assert_raises(GitDS::DuplicatePropertyError, 'DuplicateProperty ! thrown') {
|
261
|
+
eval "
|
262
|
+
class TestDupeModelItem < GitDS::ModelItem
|
263
|
+
name 'testdupe'
|
264
|
+
property(:data, 0)
|
265
|
+
property(:data, '')
|
266
|
+
end
|
267
|
+
"
|
268
|
+
}
|
269
|
+
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_modelitem_proxy
|
273
|
+
id = ['a1', 'a2', 'a3']
|
274
|
+
data = ['01', '02', '03']
|
275
|
+
|
276
|
+
proxy_class = GitDS::ModelItemClassProxy.new(TestDbModelItem)
|
277
|
+
assert_equal(TestDbModelItem.instance_path(@model.root.path, id[0]),
|
278
|
+
proxy_class.instance_path(@model.root.path, id[0]),
|
279
|
+
'Proxy instance_path differs from class instance_path')
|
280
|
+
|
281
|
+
# create ModelItems
|
282
|
+
id.each_with_index do |i, idx|
|
283
|
+
TestDbModelItem.create @model.root, {:ident => i, :data => data[idx] }
|
284
|
+
end
|
285
|
+
assert_equal(3, TestDbModelItem.list_in_path(@model,@model.root.path).count,
|
286
|
+
'DbModelItem not created')
|
287
|
+
assert_equal(TestDbModelItem.list_in_path(@model, @model.root.path),
|
288
|
+
proxy_class.list_in_path(@model, @model.root.path),
|
289
|
+
'Proxy list_in_path differs from class list_in_path')
|
290
|
+
|
291
|
+
# create a link from item 1 to item 0
|
292
|
+
path = TestDbModelItem.instance_path(@model.root.path, id[1])
|
293
|
+
parent = TestDbModelItem.new(@model, path)
|
294
|
+
path = TestDbModelItem.instance_path(@model.root.path, id[0])
|
295
|
+
target = TestDbModelItem.new(@model, path)
|
296
|
+
proxy_class.create(parent, {:path => target.path, :ident => target.ident})
|
297
|
+
|
298
|
+
# list and instantiate links
|
299
|
+
ids = TestDbModelItem.list(parent)
|
300
|
+
assert_equal(1, ids.count, 'Link not created!')
|
301
|
+
linked = proxy_class.new(@model,
|
302
|
+
proxy_class.instance_path(parent.path, ids[0]))
|
303
|
+
assert_equal(target.ident, linked.ident, 'Linked item != target (ident)')
|
304
|
+
assert_equal(target.property(:data), linked.property(:data),
|
305
|
+
'Linked item does not match item data')
|
306
|
+
|
307
|
+
# create proxy list in item 2
|
308
|
+
path = TestDbModelItem.instance_path(@model.root.path, id[2])
|
309
|
+
parent = TestDbModelItem.new(@model, path)
|
310
|
+
items = GitDS::ModelItemList.new(proxy_class, @model, parent.path)
|
311
|
+
|
312
|
+
path = TestDbModelItem.instance_path(@model.root.path, id[0])
|
313
|
+
tgt1 = TestDbModelItem.new(@model, path)
|
314
|
+
proxy_class.create(parent, {:path => tgt1.path, :ident => tgt1.ident})
|
315
|
+
assert_equal(1, items.keys.count, 'ProxyItemList has wrong count')
|
316
|
+
|
317
|
+
path = TestDbModelItem.instance_path(@model.root.path, id[1])
|
318
|
+
tgt2 = TestDbModelItem.new(@model, path)
|
319
|
+
items.add(parent, {:path => tgt2.path, :ident => tgt2.ident})
|
320
|
+
assert_equal(2, items.keys.count, 'ProxyItemList has wrong count')
|
321
|
+
|
322
|
+
linked = proxy_class.new(@model,
|
323
|
+
proxy_class.instance_path(parent.path, ids[0]))
|
324
|
+
assert_equal(tgt1.ident, linked.ident, 'Linked item != target (ident)')
|
325
|
+
assert_equal(tgt1.property(:data), linked.property(:data),
|
326
|
+
'Linked item does not match item data')
|
327
|
+
|
328
|
+
# test exceptions on create, new
|
329
|
+
assert_raises(GitDS::ProxyItemError, 'No exception on bad link path') {
|
330
|
+
linked = proxy_class.new(@model,
|
331
|
+
proxy_class.instance_path(parent.path, 'zz'))
|
332
|
+
}
|
333
|
+
assert_raises(GitDS::ProxyItemError, 'No exception on bad target path') {
|
334
|
+
proxy_class.create(parent, {:ident => tgt1.ident})
|
335
|
+
}
|
336
|
+
assert_raises(GitDS::ProxyItemError, 'No exception on bad target path') {
|
337
|
+
proxy_class.create(parent, {:ident => tgt1.ident, :path => ''})
|
338
|
+
}
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_branch
|
342
|
+
num = @model.db.heads.count
|
343
|
+
@model.branched_transaction {
|
344
|
+
index.add('tmp/1', '1')
|
345
|
+
}
|
346
|
+
assert_equal(num+1, @model.db.heads.count, 'Anon BranchTransaction failed')
|
347
|
+
|
348
|
+
name = 'named branch transaction'
|
349
|
+
num = @model.db.heads.count
|
350
|
+
@model.branched_transaction(name) {
|
351
|
+
index.add('tmp/2', '2')
|
352
|
+
}
|
353
|
+
assert_equal(num+1, @model.db.heads.count, 'Named BranchTransaction failed')
|
354
|
+
assert_equal(1,
|
355
|
+
@model.db.heads.select{|h| h.name == @model.db.clean_tag(name)}.count,
|
356
|
+
'Named BranchTransaction not present.')
|
357
|
+
end
|
358
|
+
|
359
|
+
end
|
360
|
+
|