kronk 1.4.0 → 1.5.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.
- data/.gemtest +0 -0
- data/History.rdoc +22 -0
- data/Manifest.txt +15 -6
- data/README.rdoc +5 -6
- data/Rakefile +5 -5
- data/lib/kronk.rb +164 -194
- data/lib/kronk/cmd.rb +188 -74
- data/lib/kronk/constants.rb +90 -0
- data/lib/kronk/data_renderer.rb +146 -0
- data/lib/kronk/diff.rb +4 -92
- data/lib/kronk/path/transaction.rb +2 -0
- data/lib/kronk/player.rb +233 -0
- data/lib/kronk/player/benchmark.rb +261 -0
- data/lib/kronk/player/input_reader.rb +54 -0
- data/lib/kronk/player/output.rb +49 -0
- data/lib/kronk/player/request_parser.rb +24 -0
- data/lib/kronk/player/stream.rb +50 -0
- data/lib/kronk/player/suite.rb +123 -0
- data/lib/kronk/plist_parser.rb +4 -0
- data/lib/kronk/request.rb +265 -241
- data/lib/kronk/response.rb +330 -149
- data/lib/kronk/test/assertions.rb +2 -2
- data/lib/kronk/xml_parser.rb +7 -1
- data/test/mocks/cookies.yml +32 -0
- data/test/mocks/get_request.txt +6 -0
- data/test/test_assertions.rb +6 -6
- data/test/test_cmd.rb +708 -0
- data/test/test_diff.rb +210 -75
- data/test/test_helper.rb +140 -0
- data/test/test_helper_methods.rb +4 -4
- data/test/test_input_reader.rb +103 -0
- data/test/test_kronk.rb +142 -141
- data/test/test_player.rb +589 -0
- data/test/test_request.rb +147 -212
- data/test/test_request_parser.rb +31 -0
- data/test/test_response.rb +206 -15
- metadata +41 -74
- data/bin/yzma +0 -13
- data/lib/kronk/data_set.rb +0 -144
- data/lib/yzma.rb +0 -174
- data/lib/yzma/randomizer.rb +0 -54
- data/lib/yzma/report.rb +0 -47
- data/test/test_data_set.rb +0 -213
data/bin/yzma
DELETED
data/lib/kronk/data_set.rb
DELETED
@@ -1,144 +0,0 @@
|
|
1
|
-
class Kronk
|
2
|
-
|
3
|
-
##
|
4
|
-
# THIS CLASS IS DEPRECATED AND WILL BE REMOVED IN KRONK-1.5.x
|
5
|
-
#
|
6
|
-
# Wraps a complex data structure to provide a search-driven interface.
|
7
|
-
|
8
|
-
class DataSet
|
9
|
-
|
10
|
-
# Deep merge proc for recursive Hash merging.
|
11
|
-
DEEP_MERGE =
|
12
|
-
proc do |key,v1,v2|
|
13
|
-
Hash === v1 && Hash === v2 ? v1.merge(v2,&DEEP_MERGE) : v2
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
attr_accessor :data
|
18
|
-
|
19
|
-
def initialize data
|
20
|
-
@data = data
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
##
|
25
|
-
# Modify the data object by passing inclusive or exclusive data paths.
|
26
|
-
# Supports the following options:
|
27
|
-
# :only_data:: String/Array - keep data that matches the paths
|
28
|
-
# :ignore_data:: String/Array - remove data that matches the paths
|
29
|
-
#
|
30
|
-
# Deprecated options:
|
31
|
-
# :only_data_with:: String/Array - keep data with a matched child
|
32
|
-
# :ignore_data_with:: String/Array - remove data with a matched child
|
33
|
-
#
|
34
|
-
# Note: the data is processed in the following order:
|
35
|
-
# * only_data
|
36
|
-
# * ignore_data
|
37
|
-
|
38
|
-
def modify options
|
39
|
-
warn_path_deprecation! if options[:ignore_data_with] ||
|
40
|
-
options[:only_data_with]
|
41
|
-
|
42
|
-
collect_data_points options[:only_data_with], true if
|
43
|
-
options[:only_data_with]
|
44
|
-
|
45
|
-
delete_data_points options[:ignore_data_with], true if
|
46
|
-
options[:ignore_data_with]
|
47
|
-
|
48
|
-
collect_data_points options[:only_data] if options[:only_data]
|
49
|
-
|
50
|
-
delete_data_points options[:ignore_data] if options[:ignore_data]
|
51
|
-
|
52
|
-
@data
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
##
|
57
|
-
# New implementation of DataSet#modify
|
58
|
-
|
59
|
-
def fetch options
|
60
|
-
warn_path_deprecation! if options[:ignore_data_with] ||
|
61
|
-
options[:only_data_with]
|
62
|
-
|
63
|
-
options[:only_data] = [*options[:only_data]].compact
|
64
|
-
options[:ignore_data] = [*options[:ignore_data]].compact
|
65
|
-
|
66
|
-
options[:only_data].concat(
|
67
|
-
[*options[:only_data_with]].map!{|path| path << "/.."}
|
68
|
-
) if options[:only_data_with]
|
69
|
-
|
70
|
-
options[:ignore_data].concat(
|
71
|
-
[*options[:ignore_data_with]].map!{|path| path << "/.."}
|
72
|
-
) if options[:ignore_data_with]
|
73
|
-
|
74
|
-
Path::Transaction.run @data, options do |t|
|
75
|
-
t.select(*options[:only_data])
|
76
|
-
t.delete(*options[:ignore_data])
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
|
81
|
-
##
|
82
|
-
# Keep only specific data points from the data structure.
|
83
|
-
|
84
|
-
def collect_data_points data_paths, affect_parent=false
|
85
|
-
Kronk::Cmd.warn "DataSet#collect_data_points deprecated. "+
|
86
|
-
"Use Path::Transaction"
|
87
|
-
|
88
|
-
new_data = @data.class.new
|
89
|
-
|
90
|
-
[*data_paths].each do |data_path|
|
91
|
-
opts = Path.parse_regex_opts! data_path
|
92
|
-
data_path << "/.." if affect_parent
|
93
|
-
|
94
|
-
Path.find data_path, @data, opts do |data, k, path|
|
95
|
-
curr_data = @data
|
96
|
-
new_curr_data = new_data
|
97
|
-
|
98
|
-
path.each_with_index do |key, i|
|
99
|
-
if i == path.length - 1
|
100
|
-
new_curr_data[key] = curr_data[key]
|
101
|
-
else
|
102
|
-
new_curr_data[key] ||= curr_data[key].class.new
|
103
|
-
new_curr_data = new_curr_data[key]
|
104
|
-
curr_data = curr_data[key]
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
@data.replace new_data
|
111
|
-
end
|
112
|
-
|
113
|
-
|
114
|
-
##
|
115
|
-
# Remove specific data points from the data structure.
|
116
|
-
|
117
|
-
def delete_data_points data_paths, affect_parent=false
|
118
|
-
Kronk::Cmd.warn "DataSet#delete_data_points deprecated. "+
|
119
|
-
"Use Path::Transaction"
|
120
|
-
|
121
|
-
[*data_paths].each do |data_path|
|
122
|
-
opts = Path.parse_regex_opts! data_path
|
123
|
-
data_path << "/.." if affect_parent
|
124
|
-
|
125
|
-
Path.find data_path, @data, opts do |obj, k, path|
|
126
|
-
next unless obj.respond_to? :[]
|
127
|
-
|
128
|
-
del_method = Array === obj ? :delete_at : :delete
|
129
|
-
obj.send del_method, k
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
@data
|
134
|
-
end
|
135
|
-
|
136
|
-
|
137
|
-
private
|
138
|
-
|
139
|
-
def warn_path_deprecation!
|
140
|
-
Kronk::Cmd.warn "The :ignore_data_with and :only_data_with options "+
|
141
|
-
"are deprecated. Use the '/..' path notation."
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
data/lib/yzma.rb
DELETED
@@ -1,174 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'kronk'
|
3
|
-
|
4
|
-
##
|
5
|
-
# Yzma bosses Kronk around to give you meaningful diff variation
|
6
|
-
# statistical data:
|
7
|
-
# Yzma.report "My Report" do
|
8
|
-
# compare uri1, uri2, :count => 100 do
|
9
|
-
# randomize_param :limit, 20..200, :optional => true, :allow_blank => true
|
10
|
-
#
|
11
|
-
# randomize_param :q, %w{pizza restaurant flowers}
|
12
|
-
#
|
13
|
-
# randomize_param :g, %w{91106 91203}
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# compare uri3, uri4, :count => 10,
|
17
|
-
# :title => "Second Compare"
|
18
|
-
# end
|
19
|
-
|
20
|
-
class Yzma
|
21
|
-
|
22
|
-
require 'yzma/report'
|
23
|
-
require 'yzma/randomizer'
|
24
|
-
|
25
|
-
|
26
|
-
##
|
27
|
-
# Parses ARGV for Yzma.
|
28
|
-
|
29
|
-
def self.parse_args argv
|
30
|
-
options = {:files => []}
|
31
|
-
|
32
|
-
opts = OptionParser.new do |opt|
|
33
|
-
opt.program_name = File.basename $0
|
34
|
-
opt.version = Kronk::VERSION
|
35
|
-
opt.release = nil
|
36
|
-
|
37
|
-
opt.banner = <<-STR
|
38
|
-
|
39
|
-
#{opt.program_name} #{opt.version}
|
40
|
-
|
41
|
-
Run diff reports between two URI requests.
|
42
|
-
|
43
|
-
Usage:
|
44
|
-
#{opt.program_name} --help
|
45
|
-
#{opt.program_name} --version
|
46
|
-
#{opt.program_name} file1 [file2 ...]
|
47
|
-
STR
|
48
|
-
end
|
49
|
-
|
50
|
-
opts.parse! argv
|
51
|
-
|
52
|
-
options[:files] = argv.dup
|
53
|
-
|
54
|
-
if options[:files].empty?
|
55
|
-
$stderr << "\nError: At least one report file must be specified.\n"
|
56
|
-
$stderr << "See 'yzma --help' for usage\n\n"
|
57
|
-
exit 1
|
58
|
-
end
|
59
|
-
|
60
|
-
options
|
61
|
-
end
|
62
|
-
|
63
|
-
|
64
|
-
##
|
65
|
-
# Construct and run an Yzma report.
|
66
|
-
|
67
|
-
def self.report name_or_report=nil, &block
|
68
|
-
yzma = new name_or_report
|
69
|
-
|
70
|
-
yzma.instance_eval(&block)
|
71
|
-
|
72
|
-
yzma.report.header << "Ran #{yzma.comparisons} URI comparison(s)"
|
73
|
-
yzma.report.header << "Iterated a total of #{yzma.iterations} case(s)"
|
74
|
-
|
75
|
-
curr_req = nil
|
76
|
-
|
77
|
-
yzma.report.write do |req, data|
|
78
|
-
next unless data[:diff] > 0
|
79
|
-
"\n#{data[:diff]} avg diffs:\n#{req[0]} - #{req[1]}\n"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
##
|
85
|
-
# Run the Yzma command.
|
86
|
-
|
87
|
-
def self.run argv=ARGV
|
88
|
-
options = parse_args argv
|
89
|
-
options[:files].each do |file|
|
90
|
-
self.instance_eval File.read(file)
|
91
|
-
end
|
92
|
-
|
93
|
-
exit 2 if self.diffs > 0
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
class << self
|
98
|
-
attr_accessor :diffs
|
99
|
-
end
|
100
|
-
|
101
|
-
self.diffs = 0
|
102
|
-
|
103
|
-
|
104
|
-
attr_reader :report, :comparisons, :iterations
|
105
|
-
|
106
|
-
##
|
107
|
-
# Initialize Izma with optional name.
|
108
|
-
|
109
|
-
def initialize name_or_report=nil
|
110
|
-
case name_or_report
|
111
|
-
when String
|
112
|
-
@name = name_or_report
|
113
|
-
@report = Report.new @name
|
114
|
-
|
115
|
-
when Report
|
116
|
-
@report = name_or_report
|
117
|
-
@name = @report.name
|
118
|
-
|
119
|
-
else
|
120
|
-
@name = 'Yzma Report'
|
121
|
-
@report = Report.new @name
|
122
|
-
end
|
123
|
-
|
124
|
-
@comparisons = 0
|
125
|
-
@iterations = 0
|
126
|
-
end
|
127
|
-
|
128
|
-
|
129
|
-
##
|
130
|
-
# Compare two paths or uris. Second uri may be omitted.
|
131
|
-
# Supports all Kronk.compare options, plus:
|
132
|
-
# :count:: Integer - number of times to run the endpoint; default 1.
|
133
|
-
# :title:: String - title to display when running compares.
|
134
|
-
|
135
|
-
def compare uri1, uri2, options={}, &block
|
136
|
-
options = options.dup
|
137
|
-
count = options.delete(:count) || 1
|
138
|
-
title = options.delete(:title) || "#{uri1} --- #{uri2}"
|
139
|
-
|
140
|
-
@comparisons = @comparisons.next
|
141
|
-
|
142
|
-
diff_avg = 0
|
143
|
-
diff_cnt = 0
|
144
|
-
|
145
|
-
puts title
|
146
|
-
1.upto(count) do |i|
|
147
|
-
randomizer = Randomizer.new
|
148
|
-
randomizer.instance_eval &block if block_given?
|
149
|
-
|
150
|
-
randomized_opts = options.merge randomizer.to_options
|
151
|
-
|
152
|
-
begin
|
153
|
-
diff = Kronk.compare uri1, uri2, randomized_opts
|
154
|
-
|
155
|
-
diff_avg = (diff_avg * diff_cnt + diff.count) / (diff_cnt + 1)
|
156
|
-
diff_cnt = diff_cnt.next
|
157
|
-
|
158
|
-
@iterations = @iterations.next
|
159
|
-
|
160
|
-
$stdout << (diff.count > 0 ? "D" : ".")
|
161
|
-
self.class.diffs = self.class.diffs + diff.count
|
162
|
-
|
163
|
-
rescue Kronk::Request::NotFoundError
|
164
|
-
$stdout << "E"
|
165
|
-
end
|
166
|
-
|
167
|
-
$stdout.flush
|
168
|
-
end
|
169
|
-
|
170
|
-
@report.add [uri1, uri2], :diff => diff_avg
|
171
|
-
|
172
|
-
$stdout << "\n\n"
|
173
|
-
end
|
174
|
-
end
|
data/lib/yzma/randomizer.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
class Yzma
|
2
|
-
|
3
|
-
##
|
4
|
-
# Randomizes params, data, and headers for Yzma requests.
|
5
|
-
|
6
|
-
class Randomizer
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@options = {}
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
def to_options
|
14
|
-
@options.dup
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
def randomize_param name, values, options={}
|
19
|
-
@options[:query] ||= {}
|
20
|
-
assign_random @options[:query], name, values, options
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
def randomize_data name, values, options={}
|
25
|
-
@options[:data] ||= {}
|
26
|
-
assign_random @options[:data], name, values, options
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
def randomize_header name, values, options={}
|
31
|
-
@options[:headers] ||= {}
|
32
|
-
assign_random @options[:headers], name, values, options
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
def assign_random obj, key, values, options={}
|
37
|
-
random_value = pick_random values, options
|
38
|
-
obj[key] = random_value if random_value
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
def pick_random val, options={}
|
43
|
-
val = File.readlines val if String === val
|
44
|
-
val = val.to_a if Range === val
|
45
|
-
|
46
|
-
val << "" if options[:allow_blank]
|
47
|
-
val << nil if options[:optional]
|
48
|
-
|
49
|
-
return if val.empty?
|
50
|
-
|
51
|
-
val[rand(val.length)]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
data/lib/yzma/report.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
class Yzma
|
2
|
-
|
3
|
-
##
|
4
|
-
# Used to build and display Yzma reports.
|
5
|
-
# Other report types can be created by inheriting this class and
|
6
|
-
# overridding the 'write' method to use @data as desired.
|
7
|
-
|
8
|
-
class Report
|
9
|
-
|
10
|
-
attr_accessor :data, :header, :footer, :name
|
11
|
-
|
12
|
-
def initialize name
|
13
|
-
@name = name
|
14
|
-
@data = []
|
15
|
-
@header = ["#{@name} #{Time.now}"]
|
16
|
-
@footer = ["\n"]
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
##
|
21
|
-
# Adds data and a related piece of data identification to
|
22
|
-
# the report.
|
23
|
-
|
24
|
-
def add identifier, data
|
25
|
-
@data << [identifier, data]
|
26
|
-
end
|
27
|
-
|
28
|
-
|
29
|
-
##
|
30
|
-
# Generates and writes the report to the given IO instance.
|
31
|
-
# Defaults to STDOUT.
|
32
|
-
|
33
|
-
def write io=$stdout
|
34
|
-
io << @header.join("\n")
|
35
|
-
|
36
|
-
@data.each do |identifier, data|
|
37
|
-
if block_given?
|
38
|
-
io << yield(identifier, data)
|
39
|
-
else
|
40
|
-
io << "\n#{identifier.inspect}\n#{data.inspect}\n"
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
io << @footer.join("\n")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/test/test_data_set.rb
DELETED
@@ -1,213 +0,0 @@
|
|
1
|
-
require 'test/test_helper'
|
2
|
-
|
3
|
-
class TestDataSet < Test::Unit::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
@data = {
|
7
|
-
:key1 => {
|
8
|
-
:key1a => [
|
9
|
-
"foo",
|
10
|
-
"bar",
|
11
|
-
"foobar",
|
12
|
-
{:findme => "thing"}
|
13
|
-
],
|
14
|
-
'key1b' => "findme"
|
15
|
-
},
|
16
|
-
'findme' => [
|
17
|
-
123,
|
18
|
-
456,
|
19
|
-
{:findme => 123456}
|
20
|
-
],
|
21
|
-
:key2 => "foobar",
|
22
|
-
:key3 => {
|
23
|
-
:key3a => ["val1", "val2", "val3"]
|
24
|
-
}
|
25
|
-
}
|
26
|
-
|
27
|
-
@dataset = Kronk::DataSet.new @data
|
28
|
-
|
29
|
-
@dataset_mock = Kronk::DataSet.new mock_data
|
30
|
-
|
31
|
-
Kronk::Cmd.expects :warn
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
def test_modify_only_data
|
36
|
-
data = @dataset_mock.modify :only_data => "subs/1"
|
37
|
-
assert_equal({"subs" => [nil, "b"]}, data)
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
def test_modify_ignore_data
|
42
|
-
data = @dataset_mock.modify :ignore_data => "subs/1"
|
43
|
-
|
44
|
-
expected = mock_data
|
45
|
-
expected['subs'].delete_at 1
|
46
|
-
|
47
|
-
assert_equal expected, data
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
def test_modify_only_data_with
|
52
|
-
Kronk::Cmd.expects :warn
|
53
|
-
data = @dataset_mock.modify :only_data_with => "subs/1"
|
54
|
-
assert_equal({"subs" => ["a", "b"]}, data)
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
def test_modify_only_and_ignored_data
|
59
|
-
Kronk::Cmd.expects :warn
|
60
|
-
data = @dataset_mock.modify :ignore_data => "subs/1", :only_data => "subs/1"
|
61
|
-
assert_equal({"subs" => [nil]}, data)
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
def test_collect_data_points_affect_parent_array
|
66
|
-
data = @dataset_mock.collect_data_points "**=(A|a)?", true
|
67
|
-
|
68
|
-
expected = {
|
69
|
-
"root" => [nil, ["A1", "A2"]],
|
70
|
-
"subs" => ["a", "b"]
|
71
|
-
}
|
72
|
-
|
73
|
-
assert_equal expected, data
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
def test_collect_data_points_affect_parent_hash
|
78
|
-
data = @dataset_mock.collect_data_points "**=bar?", true
|
79
|
-
assert_equal({"tests"=>{:foo=>:bar, "test"=>[[1, 2], 2.123]}}, data)
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
def test_collect_data_points_single
|
84
|
-
data = @dataset_mock.collect_data_points "subs/1"
|
85
|
-
assert_equal({"subs" => [nil, "b"]}, data)
|
86
|
-
end
|
87
|
-
|
88
|
-
|
89
|
-
def test_collect_data_points_single_wildcard
|
90
|
-
data = @dataset_mock.collect_data_points "root/*/tests"
|
91
|
-
assert_equal({"root"=>[nil, nil, nil, {:tests=>["D3a", "D3b"]}]}, data)
|
92
|
-
end
|
93
|
-
|
94
|
-
|
95
|
-
def test_collect_data_points_recursive_wildcard
|
96
|
-
data = @dataset_mock.collect_data_points "**/test?"
|
97
|
-
|
98
|
-
expected = {
|
99
|
-
"tests"=>{:foo=>:bar, "test"=>[[1, 2], 2.123]},
|
100
|
-
"root"=>[nil, nil, nil, {
|
101
|
-
:tests=>["D3a", "D3b"],
|
102
|
-
"test"=>[["D1a\nContent goes here", "D1b"], "D2"]}]
|
103
|
-
}
|
104
|
-
|
105
|
-
assert_equal expected, data
|
106
|
-
end
|
107
|
-
|
108
|
-
|
109
|
-
def test_collect_data_points_recursive_wildcard_value
|
110
|
-
data = @dataset_mock.collect_data_points "**=(A|a)?"
|
111
|
-
|
112
|
-
expected = {
|
113
|
-
"root" => [nil, ["A1", "A2"]],
|
114
|
-
"subs" => ["a"]
|
115
|
-
}
|
116
|
-
|
117
|
-
assert_equal expected, data
|
118
|
-
end
|
119
|
-
|
120
|
-
|
121
|
-
def test_delete_data_points_affect_parent_array
|
122
|
-
data = @dataset_mock.delete_data_points "**/test/0/*", true
|
123
|
-
|
124
|
-
expected = mock_data
|
125
|
-
expected['root'][3]['test'].delete_at 0
|
126
|
-
expected['tests']['test'].delete_at 0
|
127
|
-
|
128
|
-
assert_equal expected, data
|
129
|
-
end
|
130
|
-
|
131
|
-
|
132
|
-
def test_delete_data_points_affect_parent_array_value
|
133
|
-
data = @dataset_mock.delete_data_points "**/test/0/*=D*", true
|
134
|
-
|
135
|
-
expected = mock_data
|
136
|
-
expected['root'][3]['test'].delete_at 0
|
137
|
-
|
138
|
-
assert_equal expected, data
|
139
|
-
end
|
140
|
-
|
141
|
-
|
142
|
-
def test_delete_data_points_affect_parent_hash
|
143
|
-
data = @dataset_mock.delete_data_points "subs/1", true
|
144
|
-
|
145
|
-
expected = mock_data
|
146
|
-
expected.delete 'subs'
|
147
|
-
|
148
|
-
assert_equal expected, data
|
149
|
-
end
|
150
|
-
|
151
|
-
|
152
|
-
def test_delete_data_points_affect_parent_hash_value
|
153
|
-
data = @dataset_mock.delete_data_points "**/*=a", true
|
154
|
-
|
155
|
-
expected = mock_data
|
156
|
-
expected.delete 'subs'
|
157
|
-
|
158
|
-
assert_equal expected, data
|
159
|
-
end
|
160
|
-
|
161
|
-
|
162
|
-
def test_delete_data_points_single
|
163
|
-
data = @dataset_mock.delete_data_points "subs/1"
|
164
|
-
|
165
|
-
expected = mock_data
|
166
|
-
expected['subs'].delete_at 1
|
167
|
-
|
168
|
-
assert_equal expected, data
|
169
|
-
end
|
170
|
-
|
171
|
-
|
172
|
-
def test_delete_data_points_single_wildcard
|
173
|
-
data = @dataset_mock.delete_data_points "root/*/tests"
|
174
|
-
|
175
|
-
expected = mock_data
|
176
|
-
expected['root'][3].delete :tests
|
177
|
-
|
178
|
-
assert_equal expected, data
|
179
|
-
end
|
180
|
-
|
181
|
-
|
182
|
-
def test_delete_data_points_single_wildcard_qmark
|
183
|
-
data = @dataset_mock.delete_data_points "subs/?"
|
184
|
-
|
185
|
-
expected = mock_data
|
186
|
-
expected['subs'].clear
|
187
|
-
|
188
|
-
assert_equal expected, data
|
189
|
-
end
|
190
|
-
|
191
|
-
|
192
|
-
def test_delete_data_points_recursive_wildcard
|
193
|
-
data = @dataset_mock.delete_data_points "**/test?"
|
194
|
-
|
195
|
-
expected = mock_data
|
196
|
-
expected['root'][3].delete :tests
|
197
|
-
expected['root'][3].delete 'test'
|
198
|
-
expected.delete "tests"
|
199
|
-
|
200
|
-
assert_equal expected, data
|
201
|
-
end
|
202
|
-
|
203
|
-
|
204
|
-
def test_delete_data_points_recursive_wildcard_value
|
205
|
-
data = @dataset_mock.delete_data_points "**=A?|a?"
|
206
|
-
|
207
|
-
expected = mock_data
|
208
|
-
expected['root'][1].clear
|
209
|
-
expected['subs'] = ["b"]
|
210
|
-
|
211
|
-
assert_equal expected, data
|
212
|
-
end
|
213
|
-
end
|