Skip to content

Commit 652bc5c

Browse files
committed
test: Improve overall testing
1 parent 53f31d2 commit 652bc5c

9 files changed

+318
-62
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,5 @@ bpm install
5757
## TODO
5858
- error on invalid references (`type=object` in virtual object metadata, when it is referencing an array)
5959
- ensure error (for set primarily) if the virtual object references a variable that does not exist
60-
- "queried for X, but found existing object": print object in error (same with indexed arrays)
6160
- use ${param@A} on newer bash instead of declare -p
61+
- error if set in array out of bounds?

pkg/lib/traverse-get.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,17 @@ bash_object.traverse-get() {
8181
esac
8282
for ((i=0; i<${#REPLIES[@]}; i++)); do
8383
local key="${REPLIES[$i]}"
84-
filter_stack+=("$key")
85-
86-
bash_object.trace_loop
8784

8885
local is_index_of_array='no'
8986
if [ "${key::1}" = $'\x1C' ]; then
9087
key="${key#?}"
9188
is_index_of_array='yes'
9289
fi
9390

91+
filter_stack+=("$key")
92+
93+
bash_object.trace_loop
94+
9495
# If 'key' is not a member of object or index of array, error
9596
if [ -z "${current_object["$key"]+x}" ]; then
9697
bash_object.util.die 'ERROR_NOT_FOUND' "Key or index '$key' (filter index '$i') does not exist"

pkg/lib/traverse-set.sh

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -151,18 +151,19 @@ bash_object.traverse-set() {
151151
esac
152152
for ((i=0; i<${#REPLIES[@]}; i++)); do
153153
local key="${REPLIES[$i]}"
154-
filter_stack+=("$key")
155-
bash_object.util.generate_filter_stack_string
156-
local filter_stack_string="$REPLY"
157-
158-
bash_object.trace_loop
159154

160155
local is_index_of_array='no'
161156
if [ "${key::1}" = $'\x1C' ]; then
162157
key="${key#?}"
163158
is_index_of_array='yes'
164159
fi
165160

161+
filter_stack+=("$key")
162+
bash_object.util.generate_filter_stack_string
163+
local filter_stack_string="$REPLY"
164+
165+
bash_object.trace_loop
166+
166167
# If 'key' is not a member of object or index of array, error
167168
if [ -z "${current_object["$key"]+x}" ]; then
168169
# If we are before the last element in the query, then error
@@ -181,10 +182,6 @@ bash_object.traverse-set() {
181182
bash_object.util.generate_vobject_name "$root_object_name" "$filter_stack_string"
182183
local global_object_name="$REPLY"
183184

184-
if bash_object.ensure.variable_is_valid "$global_object_name"; then :; else
185-
return
186-
fi
187-
188185
if bash_object.ensure.variable_does_not_exist "$global_object_name"; then :; else
189186
return
190187
fi
@@ -215,15 +212,11 @@ bash_object.traverse-set() {
215212
bash_object.util.generate_vobject_name "$root_object_name" "$filter_stack_string"
216213
local global_array_name="$REPLY"
217214

218-
if bash_object.ensure.variable_is_valid "$global_array_name"; then :; else
219-
return
220-
fi
221-
222215
if bash_object.ensure.variable_does_not_exist "$global_array_name"; then :; else
223216
return
224217
fi
225218

226-
if ! eval "declare -ga $global_array_name=()"; then
219+
if ! eval "declare -ga $global_array_name=()" 2>/dev/null; then
227220
bash_object.util.die 'ERROR_INTERNAL' 'Eval declare failed'
228221
return
229222
fi

pkg/lib/util/ensure.sh

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
# shellcheck shell=bash
22

3-
# TODO: double-check if new_current_object_name only has underscores, dots, etc. (printf %q?)
4-
bash_object.ensure.variable_is_valid() {
5-
return 0
6-
}
7-
83
# @description Ensure the variable already exists
94
bash_object.ensure.variable_does_exist() {
105
local variable_name="$1"
@@ -29,7 +24,7 @@ bash_object.ensure.variable_does_not_exist() {
2924
return
3025
fi
3126

32-
if bash_object.ensure.variable_does_exist "$1"; then
27+
if declare -p "$variable_name" &>/dev/null; then
3328
bash_object.util.die 'ERROR_INTERNAL' "Variable '$variable_name' exists, but it shouldn't"
3429
return
3530
fi
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
#!/usr/bin/env bats
2+
3+
# @brief '-2' tests the same things as 1, but uses the native subcommands
4+
# rather than constructing the objects and arrays manually
5+
6+
load './util/init.sh'
7+
8+
# get-object
9+
@test "Error on get-object'ing string" {
10+
declare -A OBJECT=([my_key]='string_value2')
11+
12+
run bobject get-object --as-value OBJECT '.my_key'
13+
14+
assert_failure
15+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
16+
assert_line -p 'Queried for object, but found existing string'
17+
}
18+
19+
@test "Error on get-object'ing string inside object" {
20+
declare -A SUB_OBJECT=([nested]='string_value')
21+
declare -A OBJECT=()
22+
23+
bobject set-object --by-ref OBJECT '.my_key' SUB_OBJECT
24+
run bobject get-object --as-value OBJECT '.my_key.nested'
25+
26+
assert_failure
27+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
28+
assert_line -p 'Queried for object, but found existing string'
29+
}
30+
31+
@test "Error on get-object'ing string inside array" {
32+
declare -a SUB_ARRAY=(upsilon phi chi psi omicron)
33+
declare -A OBJECT=()
34+
35+
bobject set-array --by-ref OBJECT '.my_key' SUB_ARRAY
36+
run bobject get-object --as-value OBJECT '.["my_key"].[3]'
37+
38+
assert_failure
39+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
40+
assert_line -p 'Queried for object, but found existing string'
41+
}
42+
43+
@test "Error on get-object'ing array" {
44+
declare -a SUB_ARRAY=(omicron pi rho)
45+
declare -A OBJECT=()
46+
47+
bobject set-array --by-ref OBJECT '.my_key' SUB_ARRAY
48+
run bobject get-object --as-value OBJECT '.my_key'
49+
50+
assert_failure
51+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
52+
assert_line -p 'Queried for object, but found existing array'
53+
}
54+
55+
@test "Error on get-object'ing array inside object" {
56+
declare -a SUB_SUB_ARRAY=(omicron pi rho)
57+
declare -A SUB_OBJECT=()
58+
declare -A OBJECT=()
59+
60+
bobject set-object --by-ref OBJECT '.my_key' SUB_OBJECT
61+
bobject set-array --by-ref OBJECT '.my_key.nested' SUB_SUB_ARRAY
62+
run bobject get-object --as-value OBJECT '.my_key.nested'
63+
64+
assert_failure
65+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
66+
assert_line -p 'Queried for object, but found existing array'
67+
}
68+
69+
@test "Error on get-object'ing array inside array" {
70+
declare -a SUB_SUB_ARRAY=(alpha beta gamma delta)
71+
declare -a SUB_ARRAY=(upsilon phi chi)
72+
declare -A OBJECT=()
73+
74+
bobject set-array --by-ref OBJECT '.my_key' SUB_ARRAY
75+
bobject set-array --by-ref OBJECT '.["my_key"].[3]' SUB_SUB_ARRAY
76+
run bobject get-object --as-value OBJECT '.["my_key"].[3]'
77+
78+
assert_failure
79+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
80+
assert_line -p 'Queried for object, but found existing array'
81+
}
82+
83+
# get-array
84+
@test "Error on get-array'ing string" {
85+
declare -A OBJECT=([my_key]='string_value2')
86+
87+
run bobject get-array --as-value OBJECT '.my_key'
88+
89+
assert_failure
90+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
91+
assert_line -p 'Queried for array, but found existing string'
92+
}
93+
94+
@test "Error on get-array'ing string in object" {
95+
declare -A SUB_OBJECT=([nested]='string_value')
96+
declare -A OBJECT=()
97+
98+
bobject set-object --by-ref OBJECT '.my_key' SUB_OBJECT
99+
run bobject get-array --as-value OBJECT '.my_key.nested'
100+
101+
assert_failure
102+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
103+
assert_line -p 'Queried for array, but found existing string'
104+
}
105+
106+
@test "Error on get-array'ing string in array" {
107+
declare -a SUB_ARRAY=(epsilon zeta eta)
108+
declare -A OBJECT=()
109+
110+
bobject set-array --by-ref OBJECT '.my_key' SUB_ARRAY
111+
run bobject get-array --as-value OBJECT '.["my_key"].[2]'
112+
113+
assert_failure
114+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
115+
assert_line -p 'Queried for array, but found existing string'
116+
}
117+
118+
@test "Error on get-array'ing object" {
119+
declare -A SUB_OBJECT=([omicron]='pi')
120+
declare -A OBJECT=()
121+
122+
bobject set-object --by-ref OBJECT '.my_key' SUB_OBJECT
123+
run bobject get-array --as-value OBJECT '.my_key'
124+
125+
assert_failure
126+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
127+
assert_line -p 'Queried for array, but found existing object'
128+
}
129+
130+
@test "Error on get-array'ing object in object" {
131+
declare -A SUB_SUB_OBJECT=([omicron]='pi')
132+
declare -A SUB_OBJECT=()
133+
declare -A OBJECT=()
134+
135+
bobject set-object --by-ref OBJECT '.my_key' SUB_OBJECT
136+
bobject set-object --by-ref OBJECT '.my_key.nested' SUB_SUB_OBJECT
137+
run bobject get-array --as-value OBJECT '.my_key.nested'
138+
139+
assert_failure
140+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
141+
assert_line -p 'Queried for array, but found existing object'
142+
}
143+
144+
@test "Error on get-array'ing object in array" {
145+
declare -A SUB_SUB_OBJECT=([omicron]='pi')
146+
declare -a SUB_ARRAY=(epsilon)
147+
declare -A OBJECT=()
148+
149+
bobject set-array --by-ref OBJECT '.my_key' SUB_ARRAY
150+
bobject set-object --by-ref OBJECT '.["my_key"].[1]' SUB_SUB_OBJECT
151+
run bobject get-array --as-value OBJECT '.["my_key"].[1]'
152+
153+
assert_failure
154+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
155+
assert_line -p 'Queried for array, but found existing object'
156+
}
157+
158+
# get-string
159+
@test "Error on get-string'ing object" {
160+
declare -A SUB_OBJECT=([omicron]='pi')
161+
declare -A OBJECT=()
162+
163+
bobject set-object --by-ref OBJECT '.my_key' SUB_OBJECT
164+
run bobject get-string --as-value OBJECT '.my_key'
165+
166+
assert_failure
167+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
168+
assert_line -p 'Queried for string, but found existing object'
169+
}
170+
171+
@test "Error on get-string'ing object in object" {
172+
declare -A SUB_SUB_OBJECT=([omicron]='pi')
173+
declare -A SUB_OBJECT=()
174+
declare -A OBJECT=()
175+
176+
bobject set-object --by-ref OBJECT '.my_key' SUB_OBJECT
177+
bobject set-object --by-ref OBJECT '.my_key.nested' SUB_SUB_OBJECT
178+
run bobject get-string --as-value OBJECT '.my_key.nested'
179+
180+
assert_failure
181+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
182+
assert_line -p 'Queried for string, but found existing object'
183+
}
184+
185+
@test "Error on get-string'ing object in array" {
186+
declare -A SUB_SUB_OBJECT=([omicron]='pi')
187+
declare -a SUB_ARRAY=(epislon zeta eta )
188+
declare -A OBJECT=()
189+
190+
bobject set-array --by-ref OBJECT '.my_key' SUB_ARRAY
191+
bobject set-object --by-ref OBJECT '.["my_key"].[3]' SUB_SUB_OBJECT
192+
run bobject get-string --as-value OBJECT '.["my_key"].[3]'
193+
194+
assert_failure
195+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
196+
assert_line -p 'Queried for string, but found existing object'
197+
}
198+
199+
@test "Error on get-string'ing array" {
200+
declare -a SUB_ARRAY=(omicron pi rho)
201+
declare -A OBJECT=()
202+
203+
bobject set-array --by-ref OBJECT '.my_key' SUB_ARRAY
204+
run bobject get-string --as-value OBJECT '.my_key'
205+
206+
assert_failure
207+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
208+
assert_line -p 'Queried for string, but found existing array'
209+
}
210+
211+
@test "Error on get-string'ing array in object" {
212+
declare -a SUB_SUB_ARRAY=(omicron pi rho)
213+
declare -A SUB_OBJECT=()
214+
declare -A OBJECT=()
215+
216+
bobject set-object --by-ref OBJECT '.my_key' SUB_OBJECT
217+
bobject set-array --by-ref OBJECT '.my_key.nested' SUB_SUB_ARRAY
218+
run bobject get-string --as-value OBJECT '.my_key.nested'
219+
220+
assert_failure
221+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
222+
assert_line -p 'Queried for string, but found existing array'
223+
}
224+
225+
@test "Error on get-string'ing array in array" {
226+
declare -a SUB_SUB_ARRAY=(omicron pi rho)
227+
declare -a SUB_ARRAY=(omicron pi)
228+
declare -A OBJECT=()
229+
230+
bobject set-array --by-ref OBJECT '.my_key' SUB_ARRAY
231+
bobject set-array --by-ref OBJECT '.["my_key"].[2]' SUB_SUB_ARRAY
232+
run bobject get-string --as-value OBJECT '.["my_key"].[2]'
233+
234+
assert_failure
235+
assert_line -p "ERROR_ARGUMENTS_INCORRECT_TYPE"
236+
assert_line -p 'Queried for string, but found existing array'
237+
}

tests/get-errors-invalid-vobj-type.bats renamed to tests/get-errors-arguments-invalid-type.bats

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#!/usr/bin/env bats
22

3-
# @brief Ensures errors are thrown when the type of the vobject
4-
# does not match up with the specified type (as in get-array, get-object, etc.)
3+
# @brief Ensures errors are thrown when the type of the last
4+
# virtual object or string does not match that of the final extracted
5+
# value. For example, 'get' will error if it attempts to get an object
6+
# where a string of array currently exists. The same is true with 'set'
57

68
load './util/init.sh'
79

tests/get-errors-invalid-dereferenced-vobj-type.bats

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)