1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
|
# frozen_string_literal: true
require 'tc_helper'
require 'support/capture_warnings'
class TestDataValidation < Test::Unit::TestCase
include CaptureWarnings
def setup
# inverse defaults
@boolean_options = { allowBlank: false, hideDropDown: true, showErrorMessage: false, showInputMessage: true }
@nil_options = { formula1: 'foo', formula2: 'foo', errorTitle: 'foo', operator: :lessThan, prompt: 'foo', promptTitle: 'foo', sqref: 'foo' }
@type_option = { type: :whole }
@error_style_option = { errorStyle: :warning }
@string_options = { formula1: 'foo', formula2: 'foo', error: 'foo', errorTitle: 'foo', prompt: 'foo', promptTitle: 'foo', sqref: 'foo' }
@symbol_options = { errorStyle: :warning, operator: :lessThan, type: :whole }
@options = @boolean_options.merge(@nil_options).merge(@type_option).merge(@error_style_option)
@dv = Axlsx::DataValidation.new(@options)
end
def test_initialize
dv = Axlsx::DataValidation.new
@boolean_options.each do |key, value|
assert_equal(!value, dv.send(key.to_sym), "initialized default #{key} should be #{!value}")
assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
end
@nil_options.each do |key, value|
assert_nil(dv.send(key.to_sym), "initialized default #{key} should be nil")
assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
end
@type_option.each do |key, value|
assert_equal(:none, dv.send(key.to_sym), "initialized default #{key} should be :none")
assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
end
@error_style_option.each do |key, value|
assert_equal(:stop, dv.send(key.to_sym), "initialized default #{key} should be :stop")
assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
end
end
def test_boolean_attribute_validation
@boolean_options.each do |key, value|
assert_raise(ArgumentError, "#{key} must be boolean") { @dv.send("#{key}=".to_sym, 'A') }
assert_nothing_raised { @dv.send("#{key}=".to_sym, value) }
end
end
def test_string_attribute_validation
@string_options.each do |key, value|
assert_raise(ArgumentError, "#{key} must be string") { @dv.send("#{key}=".to_sym, :symbol) }
assert_nothing_raised { @dv.send("#{key}=".to_sym, value) }
end
end
def test_symbol_attribute_validation
@symbol_options.each do |key, value|
assert_raise(ArgumentError, "#{key} must be symbol") { @dv.send("#{key}=".to_sym, "foo") }
assert_nothing_raised { @dv.send("#{key}=".to_sym, value) }
end
end
def test_formula1
assert_raise(ArgumentError) { @dv.formula1 = 10 }
assert_nothing_raised { @dv.formula1 = "=SUM(A1:A1)" }
assert_equal("=SUM(A1:A1)", @dv.formula1)
end
def test_formula2
assert_raise(ArgumentError) { @dv.formula2 = 10 }
assert_nothing_raised { @dv.formula2 = "=SUM(A1:A1)" }
assert_equal("=SUM(A1:A1)", @dv.formula2)
end
def test_allowBlank
assert_raise(ArgumentError) { @dv.allowBlank = "foo´" }
assert_nothing_raised { @dv.allowBlank = false }
refute(@dv.allowBlank)
end
def test_error
assert_raise(ArgumentError) { @dv.error = :symbol }
assert_nothing_raised { @dv.error = "This is a error message" }
assert_equal("This is a error message", @dv.error)
end
def test_errorStyle
assert_raise(ArgumentError) { @dv.errorStyle = "foo" }
assert_nothing_raised { @dv.errorStyle = :information }
assert_equal(:information, @dv.errorStyle)
end
def test_errorTitle
assert_raise(ArgumentError) { @dv.errorTitle = :symbol }
assert_nothing_raised { @dv.errorTitle = "This is the error title" }
assert_equal("This is the error title", @dv.errorTitle)
end
def test_operator
assert_raise(ArgumentError) { @dv.operator = "foo" }
assert_nothing_raised { @dv.operator = :greaterThan }
assert_equal(:greaterThan, @dv.operator)
end
def test_prompt
assert_raise(ArgumentError) { @dv.prompt = :symbol }
assert_nothing_raised { @dv.prompt = "This is a prompt message" }
assert_equal("This is a prompt message", @dv.prompt)
end
def test_promptTitle
assert_raise(ArgumentError) { @dv.promptTitle = :symbol }
assert_nothing_raised { @dv.promptTitle = "This is the prompt title" }
assert_equal("This is the prompt title", @dv.promptTitle)
end
def test_showDropDown
warnings = capture_warnings do
assert_raise(ArgumentError) { @dv.showDropDown = "foo´" }
assert_nothing_raised { @dv.showDropDown = false }
refute(@dv.showDropDown)
end
assert_equal 2, warnings.size
assert_includes warnings.first, 'The `showDropDown` has an inverted logic, false shows the dropdown list! You should use `hideDropDown` instead.'
end
def test_hideDropDown
assert_raise(ArgumentError) { @dv.hideDropDown = "foo´" }
assert_nothing_raised { @dv.hideDropDown = false }
refute(@dv.hideDropDown)
# As hideDropdown is just an alias for showDropDown, we should test the original value too
refute(@dv.showDropDown)
end
def test_showErrorMessage
assert_raise(ArgumentError) { @dv.showErrorMessage = "foo´" }
assert_nothing_raised { @dv.showErrorMessage = false }
refute(@dv.showErrorMessage)
end
def test_showInputMessage
assert_raise(ArgumentError) { @dv.showInputMessage = "foo´" }
assert_nothing_raised { @dv.showInputMessage = false }
refute(@dv.showInputMessage)
end
def test_sqref
assert_raise(ArgumentError) { @dv.sqref = 10 }
assert_nothing_raised { @dv.sqref = "A1:A1" }
assert_equal("A1:A1", @dv.sqref)
end
def test_type
assert_raise(ArgumentError) { @dv.type = "foo" }
assert_nothing_raised { @dv.type = :list }
assert_equal(:list, @dv.type)
end
def test_whole_decimal_data_time_textLength_to_xml
p = Axlsx::Package.new
@ws = p.workbook.add_worksheet name: "data_validation"
@ws.add_data_validation("A1", { type: :whole, operator: :between, formula1: '5', formula2: '10',
showErrorMessage: true, errorTitle: 'Wrong input', error: 'Only values between 5 and 10',
errorStyle: :information, showInputMessage: true, promptTitle: 'Be carful!',
prompt: 'Only values between 5 and 10' })
doc = Nokogiri::XML.parse(@ws.to_xml_string)
# test attributes
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
[@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
[@error='Only values between 5 and 10'][@showErrorMessage=1][@allowBlank=1][@showInputMessage=1][@type='whole']
[@errorStyle='information']").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
[@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
[@error='Only values between 5 and 10'][@showErrorMessage=1][@allowBlank=1][@showInputMessage=1]
[@type='whole'][@errorStyle='information']")
# test forumula1
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='5'")
# test forumula2
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula2").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula2='10'")
end
def test_list_to_xml
p = Axlsx::Package.new
@ws = p.workbook.add_worksheet name: "data_validation"
@ws.add_data_validation("A1", { type: :list, formula1: 'A1:A5',
showErrorMessage: true, errorTitle: 'Wrong input', error: 'Only values from list',
errorStyle: :stop, showInputMessage: true, promptTitle: 'Be carful!',
prompt: 'Only values from list', hideDropDown: true })
doc = Nokogiri::XML.parse(@ws.to_xml_string)
# test attributes
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
[@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
[@showErrorMessage=1][@allowBlank=1][@showInputMessage=1][@showDropDown=1][@type='list']
[@errorStyle='stop']").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
[@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
[@showErrorMessage=1][@allowBlank=1][@showInputMessage=1][@showDropDown=1][@type='list'][@errorStyle='stop']")
# test forumula1
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='A1:A5'")
end
def test_custom_to_xml
p = Axlsx::Package.new
@ws = p.workbook.add_worksheet name: "data_validation"
@ws.add_data_validation("A1", { type: :custom, formula1: '=5/2',
showErrorMessage: true, errorTitle: 'Wrong input', error: 'Only values corresponding formula',
errorStyle: :stop, showInputMessage: true, promptTitle: 'Be carful!',
prompt: 'Only values corresponding formula' })
doc = Nokogiri::XML.parse(@ws.to_xml_string)
# test attributes
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1'][@promptTitle='Be carful!']
[@prompt='Only values corresponding formula'][@errorTitle='Wrong input'][@error='Only values corresponding formula'][@showErrorMessage=1]
[@allowBlank=1][@showInputMessage=1][@type='custom'][@errorStyle='stop']").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1'][@promptTitle='Be carful!']
[@prompt='Only values corresponding formula'][@errorTitle='Wrong input'][@error='Only values corresponding formula']
[@showErrorMessage=1][@allowBlank=1][@showInputMessage=1][@type='custom'][@errorStyle='stop']")
# test forumula1
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='=5/2'")
end
def test_none_to_xml
p = Axlsx::Package.new
@ws = p.workbook.add_worksheet name: "data_validation"
@ws.add_data_validation("A1", { type: :none,
showInputMessage: true, promptTitle: 'Be careful!',
prompt: 'This is a warning to be extra careful editing this cell' })
doc = Nokogiri::XML.parse(@ws.to_xml_string)
# test attributes
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
[@promptTitle='Be careful!'][@prompt='This is a warning to be extra careful editing this cell']
[@allowBlank=1][@showInputMessage=1][@type='none']").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
[@promptTitle='Be careful!'][@prompt='This is a warning to be extra careful editing this cell']
[@allowBlank=1][@showInputMessage=1][@type='none']")
end
def test_multiple_datavalidations_to_xml
p = Axlsx::Package.new
@ws = p.workbook.add_worksheet name: "data_validation"
@ws.add_data_validation("A1", { type: :whole, operator: :between, formula1: '5', formula2: '10',
showErrorMessage: true, errorTitle: 'Wrong input', error: 'Only values between 5 and 10',
errorStyle: :information, showInputMessage: true, promptTitle: 'Be carful!',
prompt: 'Only values between 5 and 10' })
@ws.add_data_validation("B1", { type: :list, formula1: 'A1:A5',
showErrorMessage: true, errorTitle: 'Wrong input', error: 'Only values from list',
errorStyle: :stop, showInputMessage: true, promptTitle: 'Be carful!',
prompt: 'Only values from list', hideDropDown: true })
doc = Nokogiri::XML.parse(@ws.to_xml_string)
# test attributes
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='A1']
[@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
[@error='Only values between 5 and 10'][@showErrorMessage=1][@allowBlank=1][@showInputMessage=1][@type='whole']
[@errorStyle='information']").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='A1']
[@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
[@error='Only values between 5 and 10'][@showErrorMessage=1][@allowBlank=1][@showInputMessage=1]
[@type='whole'][@errorStyle='information']")
# test attributes
assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='B1']
[@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
[@showErrorMessage=1][@allowBlank=1][@showInputMessage=1][@showDropDown=1][@type='list']
[@errorStyle='stop']").size)
assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='B1']
[@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
[@showErrorMessage=1][@allowBlank=1][@showInputMessage=1][@showDropDown=1][@type='list'][@errorStyle='stop']")
end
def test_empty_attributes
v = Axlsx::DataValidation.new
assert_equal([:allowBlank,
:error,
:errorStyle,
:errorTitle,
:prompt,
:promptTitle,
:showErrorMessage,
:showInputMessage,
:sqref,
:type], v.send(:get_valid_attributes))
end
end
|