invoca-utils 0.4.0 → 0.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/pipeline.yml +20 -0
  3. data/.gitignore +1 -3
  4. data/.rspec +3 -0
  5. data/.ruby-version +1 -1
  6. data/.tool-versions +1 -0
  7. data/Appraisals +13 -0
  8. data/CHANGELOG.md +10 -0
  9. data/Gemfile +9 -16
  10. data/Gemfile.lock +39 -48
  11. data/Rakefile +9 -6
  12. data/gemfiles/activesupport_5.gemfile +12 -0
  13. data/gemfiles/activesupport_5.gemfile.lock +58 -0
  14. data/gemfiles/activesupport_6.gemfile +12 -0
  15. data/gemfiles/activesupport_6.gemfile.lock +59 -0
  16. data/gemfiles/activesupport_7.gemfile +12 -0
  17. data/gemfiles/activesupport_7.gemfile.lock +57 -0
  18. data/invoca-utils.gemspec +18 -6
  19. data/lib/invoca/utils/exceptions.rb +5 -3
  20. data/lib/invoca/utils/version.rb +1 -1
  21. data/{test → spec}/helpers/constant_overrides.rb +0 -0
  22. data/spec/spec_helper.rb +16 -0
  23. data/spec/unit/array_spec.rb +20 -0
  24. data/spec/unit/enumerable_spec.rb +80 -0
  25. data/{test/unit/exceptions_test.rb → spec/unit/exceptions_spec.rb} +17 -17
  26. data/spec/unit/guaranteed_utf8_string_spec.rb +260 -0
  27. data/spec/unit/hash_spec.rb +81 -0
  28. data/spec/unit/hash_with_indifferent_access_spec.rb +100 -0
  29. data/spec/unit/map_compact_spec.rb +25 -0
  30. data/{test/unit/module_test.rb → spec/unit/module_spec.rb} +4 -4
  31. data/spec/unit/multi_sender_spec.rb +54 -0
  32. data/{test/unit/stable_sort_test.rb → spec/unit/stable_sort_spec.rb} +14 -14
  33. data/spec/unit/time_calculations_spec.rb +39 -0
  34. data/{test/unit/utils_test.rb → spec/unit/utils_spec.rb} +14 -14
  35. metadata +59 -37
  36. data/.jenkins/Jenkinsfile +0 -50
  37. data/.jenkins/ruby_build_pod.yml +0 -19
  38. data/test/test_helper.rb +0 -14
  39. data/test/unit/array_test.rb +0 -20
  40. data/test/unit/enumerable_test.rb +0 -80
  41. data/test/unit/guaranteed_utf8_string_test.rb +0 -263
  42. data/test/unit/hash_test.rb +0 -81
  43. data/test/unit/hash_with_indifferent_access_test.rb +0 -100
  44. data/test/unit/map_compact_test.rb +0 -25
  45. data/test/unit/multi_sender_test.rb +0 -56
  46. data/test/unit/time_calculations_test.rb +0 -39
@@ -1,263 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../lib/invoca/utils/guaranteed_utf8_string'
4
- require_relative '../test_helper'
5
-
6
- class GuaranteedUTF8StringTest < Minitest::Test
7
- class HasNoTo_sMethod
8
- undef :to_s
9
- end
10
-
11
- class BasicObjectWithKernelMethods
12
- end
13
-
14
- class ConvertibleToString
15
- attr_reader :to_s
16
-
17
- def initialize(string)
18
- @to_s = string
19
- end
20
- end
21
-
22
- context Invoca::Utils::GuaranteedUTF8String do
23
- context '.normalize_string' do
24
- should 'raise an error if called with an object with no to_s method' do
25
- ex = assert_raises ArgumentError do
26
- Invoca::Utils::GuaranteedUTF8String.normalize_string(HasNoTo_sMethod.new)
27
- end
28
-
29
- assert_match(/must be passed a string or an object with a non-Kernel \.to_s method but instead was GuaranteedUTF8StringTest::HasNoTo_sMethod/, ex.message)
30
- end
31
-
32
- should 'raise an error if called with a basic Ruby object' do
33
- ex = assert_raises ArgumentError do
34
- Invoca::Utils::GuaranteedUTF8String.normalize_string(BasicObjectWithKernelMethods.new)
35
- end
36
-
37
- assert_match(/must be passed a string or an object with a non-Kernel \.to_s method but instead was GuaranteedUTF8StringTest::BasicObjectWithKernelMethods/, ex.message)
38
- end
39
-
40
- should 'not mutate the original string' do
41
- ascii_string = 'new string'.encode('ASCII')
42
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(ascii_string)
43
-
44
- assert_equal ascii_string, encoded_string
45
- assert_equal Encoding::ASCII, ascii_string.encoding
46
- assert_equal Encoding::UTF_8, encoded_string.encoding
47
- end
48
-
49
- should 'return UTF-8 encoded string' do
50
- original_string = "this,is,a,valid,utf-8,csv,string\none,two,three,four,five,six,seven\n"
51
-
52
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(original_string)
53
-
54
- assert_equal original_string, encoded_string
55
- assert_equal Encoding::UTF_8, encoded_string.encoding
56
- end
57
-
58
- context "normalize_utf16" do
59
- UTF16_LE_BOM = "\xFF\xFE"
60
- UTF16_BE_BOM = "\xFE\xFF"
61
- UTF16_LE_TEST_STRING = (UTF16_LE_BOM + "v\x00a\x00l\x00i\x00d\x00,\x00u\x00t\x00f\x00-\x001\x006\x00\n\x00s\x00e\x00c\x00o\x00n\x00d\x00").force_encoding('BINARY').freeze
62
- UTF16_BE_TEST_STRING = (UTF16_BE_BOM + "\x00v\x00a\x00l\x00i\x00d\x00,\x00u\x00t\x00f\x00-\x001\x006\x00\n\x00s\x00e\x00c\x00o\x00n\x00d").force_encoding('BINARY').freeze
63
-
64
- should 'accept UTF-16LE in BINARY and return UTF-8 encoded string when true' do
65
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(UTF16_LE_TEST_STRING, normalize_utf16: true)
66
-
67
- assert_equal "valid,utf-16\nsecond", encoded_string
68
- assert_equal Encoding::UTF_8, encoded_string.encoding
69
- end
70
-
71
- should 'not check for UTF-16LE in BINARY and return UTF-8 encoded string when false' do
72
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(UTF16_LE_TEST_STRING, normalize_utf16: false)
73
- expected = "ÿþv\u0000a\u0000l\u0000i\u0000d\u0000,\u0000u\u0000t\u0000f\u0000-\u00001\u00006\u0000\n\u0000s\u0000e\u0000c\u0000o\u0000n\u0000d\u0000"
74
- assert_equal expected, encoded_string
75
- assert_equal Encoding::UTF_8, encoded_string.encoding
76
- end
77
-
78
- should 'accept UTF-16BE in BINARY and return UTF-8 encoded string when true' do
79
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(UTF16_BE_TEST_STRING, normalize_utf16: true)
80
-
81
- assert_equal "valid,utf-16\nsecond", encoded_string
82
- assert_equal Encoding::UTF_8, encoded_string.encoding
83
- end
84
-
85
- should 'not check for UTF-16BE in BINARY and return UTF-8 encoded string when false' do
86
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(UTF16_BE_TEST_STRING, normalize_utf16: false)
87
- expected = "þÿ\u0000v\u0000a\u0000l\u0000i\u0000d\u0000,\u0000u\u0000t\u0000f\u0000-\u00001\u00006\u0000\n\u0000s\u0000e\u0000c\u0000o\u0000n\u0000d"
88
- assert_equal expected, encoded_string
89
- assert_equal Encoding::UTF_8, encoded_string.encoding
90
- end
91
-
92
- context "containing embedded CP1252" do
93
- should 'accept UTF-16LE in BINARY and return UTF-8 encoded string with "private" CP1252 when normalize_utf16: true, normalize_cp1252: false' do
94
- original_string = (UTF16_LE_BOM + "\x91\x00s\x00m\x00a\x00r\x00t\x00 \x00q\x00u\x00o\x00t\x00e\x00s\x00\x92\x00\n\x00s\x00e\x00c\x00o\x00n\x00d\x00").force_encoding('BINARY')
95
-
96
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(original_string, normalize_utf16: true, normalize_cp1252: false)
97
-
98
- assert_equal "\u0091smart quotes\u0092\nsecond", encoded_string
99
- assert_equal Encoding::UTF_8, encoded_string.encoding
100
- end
101
-
102
- should 'accept UTF-16LE in BINARY and return UTF-8 encoded string with normalized CP1252 when normalize_utf16: true, normalize_cp1252: true' do
103
- original_string = (UTF16_LE_BOM + "\x91\x00s\x00m\x00a\x00r\x00t\x00 \x00q\x00u\x00o\x00t\x00e\x00s\x00\x92\x00\n\x00s\x00e\x00c\x00o\x00n\x00d\x00").force_encoding('BINARY')
104
-
105
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(original_string, normalize_utf16: true)
106
-
107
- assert_equal "‘smart quotes’\nsecond", encoded_string
108
- assert_equal Encoding::UTF_8, encoded_string.encoding
109
- end
110
-
111
- should 'accept UTF-16BE in BINARY and return UTF-8 encoded string when normalize_utf16: true, normalize_cp1252: false' do
112
- original_string = (UTF16_BE_BOM + "\x00\x91\x00s\x00m\x00a\x00r\x00t\x00 \x00q\x00u\x00o\x00t\x00e\x00s\x00\x92\x00\n\x00s\x00e\x00c\x00o\x00n\x00d").force_encoding('BINARY')
113
-
114
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(original_string, normalize_utf16: true, normalize_cp1252: false)
115
-
116
- assert_equal "\u0091smart quotes\u0092\nsecond", encoded_string
117
- assert_equal Encoding::UTF_8, encoded_string.encoding
118
- end
119
-
120
- should 'accept UTF-16BE in BINARY and return UTF-8 encoded string when normalize_utf16: true, normalize_cp1252: true' do
121
- original_string = (UTF16_BE_BOM + "\x00\x91\x00s\x00m\x00a\x00r\x00t\x00 \x00q\x00u\x00o\x00t\x00e\x00s\x00\x92\x00\n\x00s\x00e\x00c\x00o\x00n\x00d").force_encoding('BINARY')
122
-
123
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(original_string, normalize_utf16: true, normalize_cp1252: true)
124
-
125
- assert_equal "‘smart quotes’\nsecond", encoded_string
126
- assert_equal Encoding::UTF_8, encoded_string.encoding
127
- end
128
- end
129
- end
130
-
131
- context 'normalize_cp1252' do
132
- setup do
133
- @string = "This,is,NOT,a,valid,utf-8,csv,string\r\none,two,three,four,\x81five,\x91smart quotes\x92,\x93suck!\x94\n"
134
- end
135
-
136
- should 'raise ArgumentError when false' do
137
- assert_raises(ArgumentError, /xxyy/) do
138
- Invoca::Utils::GuaranteedUTF8String.normalize_string(@string, normalize_cp1252: false)
139
- end
140
- end
141
-
142
- should 'return UTF-8 encoded string after falling back to CP1252 encoding when true' do
143
- expected_string = "This,is,NOT,a,valid,utf-8,csv,string\none,two,three,four,~five,‘smart quotes’,“suck!”\n"
144
-
145
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(@string)
146
-
147
- assert_equal expected_string, encoded_string
148
- assert_equal Encoding::UTF_8, encoded_string.encoding
149
- end
150
-
151
- should "encode all 255 UTF-8 characters, returning ~ when the character isn't mapped in CP1252" do
152
- all_8_bit_characters = (1..255).map(&:chr).join
153
-
154
- final_utf_8_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(all_8_bit_characters)
155
- expected_string = "\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000A\u000B\u000C\u000A\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007F€~‚ƒ„…†‡ˆ‰Š‹Œ~Ž~~‘’“”•–—˜™š›œ~žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
156
-
157
- assert_equal expected_string, final_utf_8_string
158
- end
159
- end
160
-
161
- context 'normalize_newlines' do
162
- setup do
163
- @string = "This string\n\n\n has line feeds\ncarriage\r\r returns\rand Windows\r\n\r\n new line chars\r\nend of \n\r\r\r\nstring"
164
- end
165
-
166
- should 'return UTF-8 encoded string without normalized return chars when false' do
167
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(@string, normalize_newlines: false)
168
-
169
- assert_equal @string, encoded_string
170
- assert_equal Encoding::UTF_8, encoded_string.encoding
171
- end
172
-
173
- should 'return UTF-8 encoded string with normalized return chars when true' do
174
- expected_string = "This string\n\n\n has line feeds\ncarriage\n\n returns\nand Windows\n\n new line chars\nend of \n\n\n\nstring"
175
-
176
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(@string, normalize_newlines: true)
177
-
178
- assert_equal expected_string, encoded_string
179
- assert_equal Encoding::UTF_8, encoded_string.encoding
180
- end
181
- end
182
-
183
- context 'remove_utf8_bom' do
184
- setup do
185
- @original_string = "\xEF\xBB\xBFthis,is,a,valid,utf-8,csv,string\none,two,three,four,five,six,seven\n"
186
- end
187
-
188
- should 'return UTF-8 encoded string with BOM intact when false' do
189
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(@original_string, remove_utf8_bom: false)
190
-
191
- assert_equal "\xEF\xBB\xBFthis,is,a,valid,utf-8,csv,string\none,two,three,four,five,six,seven\n", encoded_string
192
- assert_equal Encoding::UTF_8, encoded_string.encoding
193
- end
194
-
195
- should 'return UTF-8 encoded string without BOM when true' do
196
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(@original_string, remove_utf8_bom: true)
197
-
198
- assert_equal "this,is,a,valid,utf-8,csv,string\none,two,three,four,five,six,seven\n", encoded_string
199
- assert_equal Encoding::UTF_8, encoded_string.encoding
200
- end
201
- end
202
-
203
- context 'replace_unicode_beyond_ffff' do
204
- setup do
205
- @string = "This string has some ✓ valid UTF-8 but also some 😹 emoji \xf0\x9f\x98\xb9 that are > U+FFFF"
206
- end
207
-
208
- should "consider UTF-8 code points that take > 3 bytes (above U+FFFF) to be invalid (since MySQL can't store them unless column is declared mb4) and encode them as ~ when false" do
209
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(@string, replace_unicode_beyond_ffff: false)
210
-
211
- assert_equal @string, encoded_string
212
- assert_equal Encoding::UTF_8, encoded_string.encoding
213
- end
214
-
215
- should "consider UTF-8 code points that take > 3 bytes (above U+FFFF) to be invalid (since MySQL can't store them unless column is declared mb4) and encode them as ~ when true" do
216
- expected_string = 'This string has some ✓ valid UTF-8 but also some ~ emoji ~ that are > U+FFFF'
217
-
218
- encoded_string = Invoca::Utils::GuaranteedUTF8String.normalize_string(@string, replace_unicode_beyond_ffff: true)
219
-
220
- assert_equal expected_string, encoded_string
221
- assert_equal Encoding::UTF_8, encoded_string.encoding
222
- end
223
- end
224
-
225
- context ".normalize_strings" do
226
- should "walk json doc, replacing strings in: values, inside array elements, and hash keys and values" do
227
- json_doc = {
228
- '😹' => "\xE2\x9C\x93 laughing cat",
229
- ['😹'] => ["\xE2", "\xf0\x9f\x98\xb9", { "newline" => "\r\n" }],
230
- 'cp1252' => "\x91smart quotes\x92"
231
- }
232
-
233
- normalized_json = Invoca::Utils::GuaranteedUTF8String.normalize_all_strings(json_doc,
234
- normalize_utf16: true,
235
- normalize_cp1252: true,
236
- normalize_newlines: true,
237
- remove_utf8_bom: true,
238
- replace_unicode_beyond_ffff: true)
239
-
240
- assert_equal({
241
- '~' => "✓ laughing cat",
242
- ['~'] => ["â", "~", { "newline" => "\n" }],
243
- 'cp1252' => "‘smart quotes’"
244
- }, normalized_json)
245
- end
246
- end
247
- end
248
-
249
- context 'constructor' do
250
- should 'call normalize_string with the default conversions' do
251
- mock(Invoca::Utils::GuaranteedUTF8String).normalize_string('')
252
-
253
- Invoca::Utils::GuaranteedUTF8String.new('').to_string
254
- end
255
-
256
- should 'do the same when using to_s alias' do
257
- mock(Invoca::Utils::GuaranteedUTF8String).normalize_string('')
258
-
259
- Invoca::Utils::GuaranteedUTF8String.new('').to_s
260
- end
261
- end
262
- end
263
- end
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../lib/invoca/utils/hash.rb'
4
- require_relative '../test_helper'
5
-
6
- class HashTest < Minitest::Test
7
-
8
- context 'select_hash' do
9
- should 'return a hash containing key/values identified by the block' do
10
- assert_equal({ 1 => 2, 3 => 4 }, { 1 => 2, 3 => 4, 6 => 5 }.select_hash { |key, value| key < value })
11
- end
12
-
13
- should 'handle blocks that only check values' do
14
- assert_equal({ 3 => 4, 6 => 5 }, { 1 => 2, 3 => 4, 6 => 5 }.select_hash { |value| value != 2 })
15
- end
16
- end
17
-
18
- context 'map_hash' do
19
- should 'return a hash containing values updated by the block' do
20
- assert_equal({ 1 => true, 3 => true, 6 => false }, { 1 => 2, 3 => 4, 6 => 5 }.map_hash { |key, value| key < value })
21
- end
22
-
23
- should 'handle blocks that only receive values' do
24
- assert_equal({ 1 => 4, 3 => 8, 6 => 10 }, { 1 => 2, 3 => 4, 6 => 5 }.map_hash { |value| value * 2 })
25
- end
26
- end
27
-
28
- context 'partition_hash' do
29
- should 'return two hashes, the first contains the pairs with matching keys, the second contains the rest' do
30
- assert_equal([{ 1 => 2, 3 => 4 }, { 6 => 5 }], { 1 => 2, 3 => 4, 6 => 5 }.partition_hash([1, 3]))
31
- end
32
-
33
- should 'return two hashes, the first contains the pairs with identified by the block, the second contains the rest' do
34
- assert_equal([{ 1 => 2, 3 => 4 }, { 6 => 5 }], { 1 => 2, 3 => 4, 6 => 5 }.partition_hash { |key, value| key < value })
35
- end
36
-
37
- should 'handle no matches' do
38
- assert_equal([{}, { 1 => 2, 3 => 4, 6 => 5 }], { 1 => 2, 3 => 4, 6 => 5 }.partition_hash([100]))
39
- end
40
-
41
- should 'handle all matches' do
42
- assert_equal([{ 1 => 2, 3 => 4, 6 => 5 }, {}], { 1 => 2, 3 => 4, 6 => 5 }.partition_hash { |_key, _value| true })
43
- end
44
- end
45
-
46
- context '- operator' do
47
- should 'return a hash with pairs removed that match the keys in rhs array' do
48
- assert_equal({ 3 => 4 }, { 1 => 2, 3 => 4, 6 => 5 } - [1, 6])
49
- end
50
-
51
- should 'handle empty rhs array' do
52
- assert_equal({ 1 => 2, 3 => 4, 6 => 5 }, { 1 => 2, 3 => 4, 6 => 5 } - [])
53
- end
54
-
55
- should 'handle no matches in rhs array' do
56
- assert_equal({ 1 => 2, 3 => 4, 6 => 5 }, { 1 => 2, 3 => 4, 6 => 5 } - [100, 600])
57
- end
58
-
59
- should 'handle all matches in rhs array' do
60
- assert_equal({}, { 1 => 2, 3 => 4, 6 => 5 } - [1, 3, 6])
61
- end
62
- end
63
-
64
- context '& operator' do
65
- should 'return a hash with pairs removed that do NOT match the keys in rhs array' do
66
- assert_equal({ 1 => 2, 6 => 5 }, { 1 => 2, 3 => 4, 6 => 5 } & [1, 6])
67
- end
68
-
69
- should 'handle empty rhs array' do
70
- assert_equal({}, { 1 => 2, 3 => 4, 6 => 5 } & [])
71
- end
72
-
73
- should 'handle no matches in rhs array' do
74
- assert_equal({}, { 1 => 2, 3 => 4, 6 => 5 } & [100, 600])
75
- end
76
-
77
- should 'handle all matches in rhs array' do
78
- assert_equal({ 1 => 2, 3 => 4, 6 => 5 }, { 1 => 2, 3 => 4, 6 => 5 } & [1, 3, 6])
79
- end
80
- end
81
- end
@@ -1,100 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/hash_with_indifferent_access'
4
- require_relative '../../lib/invoca/utils/hash_with_indifferent_access.rb'
5
- require_relative '../test_helper'
6
-
7
- class HashWithIndifferentAccessTest < Minitest::Test
8
-
9
- context 'partition_hash' do
10
- setup do
11
- @hash_to_test = HashWithIndifferentAccess.new('one' => 2, :three => 4, 'six' => 5)
12
- end
13
-
14
- should 'return two hashes, the first contains the pairs with matching keys, the second contains the rest' do
15
- assert_equal([{ 'one' => 2, 'three' => 4 }, { 'six' => 5 }], @hash_to_test.partition_hash(['one', 'three']))
16
- end
17
-
18
- should 'return two hashes, the first contains the pairs with identified by the block, the second contains the rest' do
19
- assert_equal([{ 'one' => 2, 'three' => 4 }, { 'six' => 5 }], @hash_to_test.partition_hash { |key, _value| ['one', 'three'].include?(key) })
20
- end
21
-
22
- should 'handle no matches' do
23
- assert_equal([{}, @hash_to_test], @hash_to_test.partition_hash([:not_found]))
24
- end
25
-
26
- should 'handle all matches' do
27
- assert_equal([@hash_to_test, {}], @hash_to_test.partition_hash { |_key, _value| true })
28
- end
29
-
30
- should 'handle symbols for key matching' do
31
- assert_equal([{ 'one' => 2, 'three' => 4 }, { 'six' => 5 }], @hash_to_test.partition_hash([:one, :three]))
32
- end
33
-
34
- should 'return HashWithIndifferentAccess objects' do
35
- matched, unmatched = @hash_to_test.partition_hash([:one, :three])
36
- assert(matched.is_a?(HashWithIndifferentAccess))
37
- assert(unmatched.is_a?(HashWithIndifferentAccess))
38
- end
39
- end
40
-
41
- context '- operator' do
42
- setup do
43
- @hash_to_test = HashWithIndifferentAccess.new('one' => 2, :three => 4, 'six' => 5)
44
- end
45
-
46
- should 'return a hash with pairs removed that match the keys in rhs array' do
47
- assert_equal({ 'three' => 4 }, @hash_to_test - ['one', 'six'])
48
- end
49
-
50
- should 'handle empty rhs array' do
51
- assert_equal(@hash_to_test, @hash_to_test - [])
52
- end
53
-
54
- should 'handle no matches in rhs array' do
55
- assert_equal(@hash_to_test, @hash_to_test - ['100', '600'])
56
- end
57
-
58
- should 'handle all matches in rhs array' do
59
- assert_equal({}, @hash_to_test - ['one', 'three', 'six'])
60
- end
61
-
62
- should 'handle symbols for key matching' do
63
- assert_equal({ 'six' => 5 }, @hash_to_test - [:one, :three])
64
- end
65
-
66
- should 'return HashWithIndifferentAccess object' do
67
- assert((@hash_to_test - [:one, :three]).is_a?(HashWithIndifferentAccess))
68
- end
69
- end
70
-
71
- context '& operator' do
72
- setup do
73
- @hash_to_test = HashWithIndifferentAccess.new('one' => 2, :three => 4, 'six' => 5)
74
- end
75
-
76
- should 'return a hash with pairs removed that do NOT match the keys in rhs array' do
77
- assert_equal({ 'one' => 2, 'six' => 5 }, @hash_to_test & ['one', 'six'])
78
- end
79
-
80
- should 'handle empty rhs array' do
81
- assert_equal({}, @hash_to_test & [])
82
- end
83
-
84
- should 'handle no matches in rhs array' do
85
- assert_equal({}, @hash_to_test & ['100', '600'])
86
- end
87
-
88
- should 'handle all matches in rhs array' do
89
- assert_equal(@hash_to_test, @hash_to_test & ['one', 'three', 'six'])
90
- end
91
-
92
- should 'handle symbols for key matching' do
93
- assert_equal({ 'one' => 2, 'three' => 4 }, @hash_to_test & [:one, :three])
94
- end
95
-
96
- should 'return HashWithIndifferentAccess object' do
97
- assert((@hash_to_test & [:one, :three]).is_a?(HashWithIndifferentAccess))
98
- end
99
- end
100
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../test_helper'
4
-
5
- class MapCompactTest < Minitest::Test
6
- should "map_compact" do
7
- assert_equal [1, 9], [1, 2, nil, 3, 4].map_compact { |item| item**2 if (nil == item ? nil : item.odd?) }
8
- end
9
-
10
- should "map_compact to empty if nothing matches" do
11
- assert_equal [], {:a => 'aaa', :b => 'bbb'}.map_compact { |key, value| value if key == :c }
12
- end
13
-
14
- should "map_compact a hash" do
15
- assert_equal ['bbb'], {:a => 'aaa', :b => 'bbb'}.map_compact { |key, value| value if key == :b }
16
- end
17
-
18
- should "map_compact empty collection" do
19
- assert_equal [], [].map_compact { |item| true }
20
- end
21
-
22
- should "not map_compact false" do
23
- assert_equal [false], [nil, false].map_compact { |a| a }
24
- end
25
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../lib/invoca/utils/multi_sender.rb'
4
- require_relative '../test_helper'
5
-
6
- class MultiSenderTest < Minitest::Test
7
- # create enumerable class for testing
8
- class LinkedList
9
- include Enumerable
10
-
11
- def initialize(head, tail = nil)
12
- @head, @tail = head, tail
13
- end
14
-
15
- def <<(item)
16
- LinkedList.new(item, self)
17
- end
18
-
19
- def inspect
20
- [@head, @tail].inspect
21
- end
22
-
23
- def each(&block)
24
- if block_given?
25
- block.call(@head)
26
- @tail&.each(&block)
27
- else
28
- to_enum(:each)
29
- end
30
- end
31
- end
32
-
33
- context 'MultiSender' do
34
- context 'with custom Enumerable' do
35
- setup do
36
- linked_list = LinkedList.new('some') << 'short' << 'words'
37
- @multi_sender = Invoca::Utils::MultiSender.new(linked_list, :map)
38
- end
39
-
40
- should 'call the same method on each item in an Enumerable and return the results as an array' do
41
- assert_equal([5, 5, 4], @multi_sender.length)
42
- end
43
-
44
- should 'handle methods with arguments' do
45
- assert_equal(['or', 'ho', 'om'], @multi_sender.slice(1, 2))
46
- end
47
- end
48
-
49
- context 'with built-in Array' do
50
- should 'call the same method on each item in an Array and return the results as an array' do
51
- multi_sender = Invoca::Utils::MultiSender.new(['some', 'short', 'words'], :map)
52
- assert_equal([4, 5, 5], multi_sender.length)
53
- end
54
- end
55
- end
56
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../test_helper'
4
-
5
- class TimeCalculationsTest < Minitest::Test
6
- context "beginning_of_hour" do
7
- Time.zone = 'Pacific Time (US & Canada)'
8
- [
9
- Time.now,
10
- Time.zone.now,
11
- Time.local(2009),
12
- Time.local(2009,3,4,5),
13
- Time.local(2001,12,31,23,59),
14
- Time.local(1970,1,1)
15
- ].each_with_index do |time, index|
16
- should "give back a time with no minutes, seconds, or msec: #{time} (#{index})" do
17
- t = time.beginning_of_hour
18
- assert_equal t.year, time.year
19
- assert_equal t.month, time.month
20
- assert_equal t.day, time.day
21
- assert_equal t.hour, time.hour
22
- assert_equal 0, t.min
23
- assert_equal 0, t.sec
24
- assert_equal 0, t.usec
25
- end
26
- end
27
- end
28
-
29
- context "end_of_day_whole_sec" do
30
- should "return the end of day with whole_sec" do
31
- t = Time.now
32
- end_of_day = t.end_of_day
33
- end_whole_sec = t.end_of_day_whole_sec
34
- assert_equal 0.0, end_whole_sec.usec
35
- assert_equal end_of_day.to_i, end_whole_sec.to_i
36
- assert_equal end_of_day.sec, end_whole_sec.sec
37
- end
38
- end
39
- end