axlsx 1.1.0 → 1.2.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 (214) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +78 -0
  3. data/LICENSE +1 -1
  4. data/README.md +132 -331
  5. data/Rakefile +17 -5
  6. data/examples/basic_charts.rb +54 -0
  7. data/examples/chart_colors.rb +88 -0
  8. data/examples/conditional_formatting/example_conditional_formatting.rb +72 -0
  9. data/examples/conditional_formatting/getting_barred.rb +37 -0
  10. data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
  11. data/examples/conditional_formatting/scaled_colors.rb +39 -0
  12. data/examples/conditional_formatting/stop_and_go.rb +37 -0
  13. data/examples/data_validation.rb +50 -0
  14. data/examples/example.rb +300 -152
  15. data/examples/example.xlsx +0 -0
  16. data/examples/example_streamed.xlsx +0 -0
  17. data/examples/extractive.pdf +0 -0
  18. data/examples/extractive.rb +45 -0
  19. data/examples/no-use_autowidth.xlsx +0 -0
  20. data/examples/sample.png +0 -0
  21. data/examples/scraping_html.rb +91 -0
  22. data/examples/shared_strings_example.xlsx +0 -0
  23. data/examples/sheet_protection.rb +10 -0
  24. data/examples/sheet_view.rb +34 -0
  25. data/examples/skydrive/real_example.rb +63 -0
  26. data/examples/two_cell_anchor_image.rb +11 -0
  27. data/lib/axlsx/content_type/content_type.rb +2 -0
  28. data/lib/axlsx/content_type/default.rb +30 -15
  29. data/lib/axlsx/content_type/override.rb +29 -14
  30. data/lib/axlsx/doc_props/app.rb +161 -104
  31. data/lib/axlsx/doc_props/core.rb +9 -5
  32. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  33. data/lib/axlsx/drawing/axis.rb +106 -35
  34. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  35. data/lib/axlsx/drawing/bar_series.rb +25 -7
  36. data/lib/axlsx/drawing/cat_axis.rb +50 -22
  37. data/lib/axlsx/drawing/chart.rb +69 -56
  38. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  39. data/lib/axlsx/drawing/drawing.rb +28 -12
  40. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  41. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  42. data/lib/axlsx/drawing/line_series.rb +20 -4
  43. data/lib/axlsx/drawing/num_data.rb +52 -0
  44. data/lib/axlsx/drawing/num_data_source.rb +61 -0
  45. data/lib/axlsx/drawing/num_val.rb +32 -0
  46. data/lib/axlsx/drawing/pic.rb +44 -4
  47. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  48. data/lib/axlsx/drawing/pie_series.rb +18 -4
  49. data/lib/axlsx/drawing/scatter_chart.rb +12 -18
  50. data/lib/axlsx/drawing/scatter_series.rb +28 -2
  51. data/lib/axlsx/drawing/ser_axis.rb +1 -1
  52. data/lib/axlsx/drawing/series.rb +1 -1
  53. data/lib/axlsx/drawing/str_data.rb +42 -0
  54. data/lib/axlsx/drawing/str_val.rb +33 -0
  55. data/lib/axlsx/drawing/title.rb +21 -9
  56. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  57. data/lib/axlsx/drawing/view_3D.rb +44 -31
  58. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  59. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  60. data/lib/axlsx/package.rb +44 -16
  61. data/lib/axlsx/rels/relationship.rb +3 -3
  62. data/lib/axlsx/rels/relationships.rb +1 -11
  63. data/lib/axlsx/stylesheet/color.rb +0 -1
  64. data/lib/axlsx/stylesheet/dxf.rb +79 -0
  65. data/lib/axlsx/stylesheet/font.rb +2 -1
  66. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  67. data/lib/axlsx/stylesheet/styles.rb +143 -50
  68. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  69. data/lib/axlsx/stylesheet/xf.rb +2 -0
  70. data/lib/axlsx/util/constants.rb +36 -0
  71. data/lib/axlsx/util/simple_typed_list.rb +15 -21
  72. data/lib/axlsx/util/validators.rb +122 -5
  73. data/lib/axlsx/version.rb +2 -7
  74. data/lib/axlsx/workbook/defined_name.rb +174 -0
  75. data/lib/axlsx/workbook/defined_names.rb +21 -0
  76. data/lib/axlsx/workbook/shared_strings_table.rb +12 -13
  77. data/lib/axlsx/workbook/workbook.rb +71 -13
  78. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  79. data/lib/axlsx/workbook/worksheet/cell.rb +45 -36
  80. data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
  81. data/lib/axlsx/workbook/worksheet/col.rb +17 -1
  82. data/lib/axlsx/workbook/worksheet/color_scale.rb +76 -0
  83. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  84. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  85. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  86. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
  87. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -0
  88. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  89. data/lib/axlsx/workbook/worksheet/data_bar.rb +97 -0
  90. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  91. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  92. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  93. data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
  94. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  95. data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
  96. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  97. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  98. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  99. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  100. data/lib/axlsx/workbook/worksheet/row.rb +69 -12
  101. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  102. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  103. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  104. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  105. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  106. data/lib/axlsx/workbook/worksheet/table.rb +3 -3
  107. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  108. data/lib/axlsx/workbook/worksheet/worksheet.rb +379 -233
  109. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  110. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  111. data/lib/axlsx.rb +31 -16
  112. data/test/benchmark.rb +30 -38
  113. data/test/content_type/tc_content_type.rb +1 -6
  114. data/test/doc_props/tc_app.rb +31 -1
  115. data/test/doc_props/tc_core.rb +3 -1
  116. data/test/drawing/tc_axis.rb +46 -3
  117. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  118. data/test/drawing/tc_bar_series.rb +17 -13
  119. data/test/drawing/tc_cat_axis.rb +3 -3
  120. data/test/drawing/tc_cat_axis_data.rb +23 -13
  121. data/test/drawing/tc_chart.rb +29 -11
  122. data/test/drawing/tc_d_lbls.rb +47 -0
  123. data/test/drawing/tc_data_source.rb +17 -0
  124. data/test/drawing/tc_drawing.rb +11 -5
  125. data/test/drawing/tc_hyperlink.rb +4 -5
  126. data/test/drawing/tc_line_series.rb +9 -11
  127. data/test/drawing/tc_named_axis_data.rb +27 -0
  128. data/test/drawing/tc_num_data.rb +31 -0
  129. data/test/drawing/tc_num_val.rb +29 -0
  130. data/test/drawing/tc_pic.rb +22 -2
  131. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  132. data/test/drawing/tc_pie_series.rb +11 -13
  133. data/test/drawing/tc_scatter_chart.rb +6 -1
  134. data/test/drawing/tc_scatter_series.rb +6 -5
  135. data/test/drawing/tc_series.rb +1 -1
  136. data/test/drawing/tc_str_data.rb +18 -0
  137. data/test/drawing/tc_str_val.rb +21 -0
  138. data/test/drawing/tc_title.rb +16 -0
  139. data/test/drawing/tc_two_cell_anchor.rb +2 -3
  140. data/test/drawing/tc_view_3D.rb +18 -18
  141. data/test/drawing/tc_vml_drawing.rb +25 -0
  142. data/test/drawing/tc_vml_shape.rb +100 -0
  143. data/test/profile.rb +2 -1
  144. data/test/rels/tc_relationship.rb +1 -0
  145. data/test/stylesheet/tc_dxf.rb +81 -0
  146. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  147. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  148. data/test/stylesheet/tc_styles.rb +163 -3
  149. data/test/stylesheet/tc_table_style.rb +8 -0
  150. data/test/stylesheet/tc_table_style_element.rb +10 -1
  151. data/test/tc_helper.rb +1 -0
  152. data/test/tc_package.rb +93 -17
  153. data/test/util/tc_simple_typed_list.rb +13 -0
  154. data/test/util/tc_validators.rb +95 -9
  155. data/test/workbook/tc_defined_name.rb +41 -0
  156. data/test/workbook/tc_workbook.rb +5 -3
  157. data/test/workbook/worksheet/table/tc_table.rb +3 -11
  158. data/test/workbook/worksheet/tc_cell.rb +52 -18
  159. data/test/workbook/worksheet/tc_cfvo.rb +31 -0
  160. data/test/workbook/worksheet/tc_col.rb +9 -0
  161. data/test/workbook/worksheet/tc_color_scale.rb +29 -0
  162. data/test/workbook/worksheet/tc_comment.rb +57 -0
  163. data/test/workbook/worksheet/tc_comments.rb +57 -0
  164. data/test/workbook/worksheet/tc_conditional_formatting.rb +217 -0
  165. data/test/workbook/worksheet/tc_data_bar.rb +39 -0
  166. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  167. data/test/workbook/worksheet/tc_date_time_converter.rb +11 -5
  168. data/test/workbook/worksheet/tc_icon_set.rb +45 -0
  169. data/test/workbook/worksheet/tc_page_setup.rb +138 -0
  170. data/test/workbook/worksheet/tc_pane.rb +94 -0
  171. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  172. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  173. data/test/workbook/worksheet/tc_row.rb +44 -13
  174. data/test/workbook/worksheet/tc_selection.rb +94 -0
  175. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  176. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  177. data/test/workbook/worksheet/tc_worksheet.rb +147 -50
  178. metadata +216 -148
  179. data/examples/example.csv +0 -1000
  180. data/examples/example.rb~ +0 -112
  181. data/lib/axlsx/drawing/cat_axis_data.rb +0 -34
  182. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  183. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  184. data/lib/axlsx/drawing/named_axis_data.rb +0 -36
  185. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  186. data/lib/axlsx/drawing/val_axis_data.rb +0 -27
  187. data/lib/axlsx/stylesheet/#num_fmt.rb# +0 -69
  188. data/lib/axlsx/util/cbf.rb +0 -333
  189. data/lib/axlsx/util/cfb.rb~ +0 -201
  190. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  191. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  192. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  193. data/lib/axlsx/util/parser.rb~ +0 -6
  194. data/lib/axlsx/util/storage.rb~ +0 -0
  195. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  196. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  197. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  198. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  199. data/lib/schema/dc.xsd~ +0 -118
  200. data/lib/schema/dcterms.xsd~ +0 -331
  201. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  202. data/test/#benchmark.txt# +0 -7
  203. data/test/#tc_helper.rb# +0 -3
  204. data/test/benchmark.rb~ +0 -0
  205. data/test/benchmark.txt +0 -6
  206. data/test/benchmark.txt~ +0 -6
  207. data/test/drawing/tc_val_axis_data.rb +0 -17
  208. data/test/example.csv +0 -1000
  209. data/test/example.xlsx +0 -0
  210. data/test/example_streamed.xlsx +0 -0
  211. data/test/tc_axlsx.rb~ +0 -0
  212. data/test/tc_helper.rb~ +0 -3
  213. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  214. data/test/workbook/worksheet/tc_col.rb~ +0 -10
@@ -0,0 +1,217 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestConditionalFormatting < Test::Unit::TestCase
4
+
5
+ def setup
6
+ p = Axlsx::Package.new
7
+ @ws = p.workbook.add_worksheet :name=>"hmmm"
8
+ @cfs = @ws.add_conditional_formatting( "A1:A1", [{ :type => :cellIs, :dxfId => 0, :priority => 1, :operator => :greaterThan, :formula => "0.5" }])
9
+ @cf = @cfs.first
10
+ @cfr = @cf.rules.first
11
+ end
12
+
13
+ def test_initialize_with_options
14
+ optioned = Axlsx::ConditionalFormatting.new( :sqref => "AA1:AB100", :rules => [1, 2] )
15
+ assert_equal("AA1:AB100", optioned.sqref)
16
+ assert_equal([1, 2], optioned.rules)
17
+ end
18
+ def test_add_as_rule
19
+
20
+ color_scale = Axlsx::ColorScale.new do |cs|
21
+ cs.colors.first.rgb = "FFDFDFDF"
22
+ cs.colors.last.rgb = "FF00FF00"
23
+ cs.value_objects.first.type = :percentile
24
+ cs.value_objects.first.val = 5
25
+ end
26
+
27
+ data_bar = Axlsx::DataBar.new :color => "FFFF0000"
28
+ icon_set = Axlsx::IconSet.new :iconSet => "5Rating"
29
+ cfr = Axlsx::ConditionalFormattingRule.new( { :type => :containsText, :text => "TRUE",
30
+ :dxfId => 0, :priority => 1,
31
+ :formula => 'NOT(ISERROR(SEARCH("FALSE",AB1)))',
32
+ :color_scale => color_scale,
33
+ :data_bar => data_bar,
34
+ :icon_set => icon_set})
35
+
36
+ assert(cfr.data_bar.is_a?(Axlsx::DataBar))
37
+ assert(cfr.icon_set.is_a?(Axlsx::IconSet))
38
+ assert(cfr.color_scale.is_a?(Axlsx::ColorScale))
39
+ cfs = @ws.add_conditional_formatting( "B2:B2", [cfr])
40
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
41
+ assert_equal(1, doc.xpath(".//conditionalFormatting[@sqref='B2:B2']//cfRule[@type='containsText'][@dxfId=0][@priority=1]").size)
42
+ assert doc.xpath(".//conditionalFormatting//cfRule[@type='containsText'][@dxfId=0][@priority=1]//formula='NOT(ISERROR(SEARCH(\"FALSE\",AB1)))'")
43
+
44
+ cfs.last.rules.last.type = :colorScale
45
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
46
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//colorScale//cfvo").size, 2)
47
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//colorScale//color").size, 2)
48
+
49
+ cfs.last.rules.last.type = :dataBar
50
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
51
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar").size, 1)
52
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar//cfvo").size, 2)
53
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar//color[@rgb='FFFF0000']").size, 1)
54
+
55
+ cfs.last.rules.last.type = :iconSet
56
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
57
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//iconSet//cfvo").size, 3)
58
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//iconSet[@iconSet='5Rating']").size, 1)
59
+
60
+ end
61
+
62
+
63
+ def test_add_as_hash
64
+
65
+ color_scale = Axlsx::ColorScale.new do |cs|
66
+ cs.colors.first.rgb = "FFDFDFDF"
67
+ cs.colors.last.rgb = "FF00FF00"
68
+ cs.value_objects.first.type = :percentile
69
+ cs.value_objects.first.val = 5
70
+ end
71
+
72
+ data_bar = Axlsx::DataBar.new :color => "FFFF0000"
73
+ icon_set = Axlsx::IconSet.new :iconSet => "5Rating"
74
+
75
+ cfs = @ws.add_conditional_formatting( "B2:B2", [{ :type => :containsText, :text => "TRUE",
76
+ :dxfId => 0, :priority => 1,
77
+ :formula => 'NOT(ISERROR(SEARCH("FALSE",AB1)))',
78
+ :color_scale => color_scale,
79
+ :data_bar => data_bar,
80
+ :icon_set => icon_set}])
81
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
82
+ assert_equal(1, doc.xpath(".//conditionalFormatting[@sqref='B2:B2']//cfRule[@type='containsText'][@dxfId=0][@priority=1]").size)
83
+ assert doc.xpath(".//conditionalFormatting//cfRule[@type='containsText'][@dxfId=0][@priority=1]//formula='NOT(ISERROR(SEARCH(\"FALSE\",AB1)))'")
84
+
85
+ cfs.last.rules.last.type = :colorScale
86
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
87
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//colorScale//cfvo").size, 2)
88
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//colorScale//color").size, 2)
89
+
90
+ cfs.last.rules.last.type = :dataBar
91
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
92
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar").size, 1)
93
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar//cfvo").size, 2)
94
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//dataBar//color[@rgb='FFFF0000']").size, 1)
95
+
96
+ cfs.last.rules.last.type = :iconSet
97
+ doc = Nokogiri::XML.parse(cfs.last.to_xml_string)
98
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//iconSet//cfvo").size, 3)
99
+ assert_equal(doc.xpath(".//conditionalFormatting//cfRule//iconSet[@iconSet='5Rating']").size, 1)
100
+
101
+ end
102
+
103
+ def test_single_rule
104
+ doc = Nokogiri::XML.parse(@cf.to_xml_string)
105
+ assert_equal(1, doc.xpath(".//conditionalFormatting//cfRule[@type='cellIs'][@dxfId=0][@priority=1][@operator='greaterThan']").size)
106
+ assert doc.xpath(".//conditionalFormatting//cfRule[@type='cellIs'][@dxfId=0][@priority=1][@operator='greaterThan']//formula='0.5'")
107
+ end
108
+
109
+ def test_many_options
110
+ cf = Axlsx::ConditionalFormatting.new( :sqref => "B3:B4" )
111
+ cf.add_rule({:type => :cellIs, :aboveAverage => false, :bottom => false, :dxfId => 0,
112
+ :equalAverage => false, :priority => 2, :operator => :lessThan, :text => "",
113
+ :percent => false, :rank => 0, :stdDev => 1, :stopIfTrue => true, :timePeriod => :today,
114
+ :formula => "0.0"})
115
+ doc = Nokogiri::XML.parse(cf.to_xml_string)
116
+ assert_equal(1, doc.xpath(".//conditionalFormatting//cfRule[@type='cellIs'][@aboveAverage='false'][@bottom='false'][@dxfId=0][@equalAverage='false'][@priority=2][@operator='lessThan'][@text=''][@percent='false'][@rank=0][@stdDev=1][@stopIfTrue='true'][@timePeriod='today']").size)
117
+ assert doc.xpath(".//conditionalFormatting//cfRule[@type='cellIs'][@aboveAverage='false'][@bottom='false'][@dxfId=0][@equalAverage='false'][@priority=2][@operator='lessThan'][@text=''][@percent='false'][@rank=0][@stdDev=1][@stopIfTrue='true'][@timePeriod='today']//formula=0.0")
118
+ end
119
+
120
+ def test_to_xml
121
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
122
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:conditionalFormatting//xmlns:cfRule[@type='cellIs'][@dxfId=0][@priority=1][@operator='greaterThan']").size)
123
+ assert doc.xpath("//xmlns:worksheet/xmlns:conditionalFormatting//xmlns:cfRule[@type='cellIs'][@dxfId=0][@priority=1][@operator='greaterThan']//xmlns:formula='0.5'")
124
+ end
125
+
126
+ def test_multiple_formats
127
+ @ws.add_conditional_formatting "B3:B3", { :type => :cellIs, :dxfId => 0, :priority => 1, :operator => :greaterThan, :formula => "1" }
128
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
129
+ assert doc.xpath("//xmlns:worksheet/xmlns:conditionalFormatting//xmlns:cfRule[@type='cellIs'][@dxfId=0][@priority=1][@operator='greaterThan']//xmlns:formula='1'")
130
+ assert doc.xpath("//xmlns:worksheet/xmlns:conditionalFormatting//xmlns:cfRule[@type='cellIs'][@dxfId=0][@priority=1][@operator='greaterThan']//xmlns:formula='0.5'")
131
+ end
132
+
133
+ def test_sqref
134
+ assert_raise(ArgumentError) { @cf.sqref = 10 }
135
+ assert_nothing_raised { @cf.sqref = "A1:A1" }
136
+ assert_equal(@cf.sqref, "A1:A1")
137
+ end
138
+
139
+ def test_type
140
+ assert_raise(ArgumentError) { @cfr.type = "illegal" }
141
+ assert_nothing_raised { @cfr.type = :containsBlanks }
142
+ assert_equal(@cfr.type, :containsBlanks)
143
+ end
144
+
145
+ def test_above_average
146
+ assert_raise(ArgumentError) { @cfr.aboveAverage = "illegal" }
147
+ assert_nothing_raised { @cfr.aboveAverage = true }
148
+ assert_equal(@cfr.aboveAverage, true)
149
+ end
150
+
151
+ def test_equal_average
152
+ assert_raise(ArgumentError) { @cfr.equalAverage = "illegal" }
153
+ assert_nothing_raised { @cfr.equalAverage = true }
154
+ assert_equal(@cfr.equalAverage, true)
155
+ end
156
+
157
+ def test_bottom
158
+ assert_raise(ArgumentError) { @cfr.bottom = "illegal" }
159
+ assert_nothing_raised { @cfr.bottom = true }
160
+ assert_equal(@cfr.bottom, true)
161
+ end
162
+
163
+ def test_operator
164
+ assert_raise(ArgumentError) { @cfr.operator = "cellIs" }
165
+ assert_nothing_raised { @cfr.operator = :notBetween }
166
+ assert_equal(@cfr.operator, :notBetween)
167
+ end
168
+
169
+ def test_dxf_id
170
+ assert_raise(ArgumentError) { @cfr.dxfId = "illegal" }
171
+ assert_nothing_raised { @cfr.dxfId = 1 }
172
+ assert_equal(@cfr.dxfId, 1)
173
+ end
174
+
175
+ def test_priority
176
+ assert_raise(ArgumentError) { @cfr.priority = -1.0 }
177
+ assert_nothing_raised { @cfr.priority = 1 }
178
+ assert_equal(@cfr.priority, 1)
179
+ end
180
+
181
+ def test_text
182
+ assert_raise(ArgumentError) { @cfr.text = 1.0 }
183
+ assert_nothing_raised { @cfr.text = "testing" }
184
+ assert_equal(@cfr.text, "testing")
185
+ end
186
+
187
+ def test_percent
188
+ assert_raise(ArgumentError) { @cfr.percent = "10%" } #WRONG!
189
+ assert_nothing_raised { @cfr.percent = true }
190
+ assert_equal(@cfr.percent, true)
191
+ end
192
+
193
+ def test_rank
194
+ assert_raise(ArgumentError) { @cfr.rank = -1 }
195
+ assert_nothing_raised { @cfr.rank = 1 }
196
+ assert_equal(@cfr.rank, 1)
197
+ end
198
+
199
+ def test_std_dev
200
+ assert_raise(ArgumentError) { @cfr.stdDev = -1 }
201
+ assert_nothing_raised { @cfr.stdDev = 1 }
202
+ assert_equal(@cfr.stdDev, 1)
203
+ end
204
+
205
+ def test_stop_if_true
206
+ assert_raise(ArgumentError) { @cfr.stopIfTrue = "illegal" }
207
+ assert_nothing_raised { @cfr.stopIfTrue = false }
208
+ assert_equal(@cfr.stopIfTrue, false)
209
+ end
210
+
211
+ def test_time_period
212
+ assert_raise(ArgumentError) { @cfr.timePeriod = "illegal" }
213
+ assert_nothing_raised { @cfr.timePeriod = :today }
214
+ assert_equal(@cfr.timePeriod, :today)
215
+ end
216
+
217
+ end
@@ -0,0 +1,39 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestDataBar < Test::Unit::TestCase
4
+ def setup
5
+ @data_bar = Axlsx::DataBar.new :color => "FF638EC6"
6
+ end
7
+
8
+ def test_defaults
9
+ assert_equal @data_bar.minLength, 10
10
+ assert_equal @data_bar.maxLength, 90
11
+ assert_equal @data_bar.showValue, true
12
+ end
13
+
14
+ def test_minLength
15
+ assert_raise(ArgumentError) { @data_bar.minLength = :invalid_type }
16
+ assert_nothing_raised { @data_bar.minLength = 0}
17
+ assert_equal(@data_bar.minLength, 0)
18
+ end
19
+
20
+ def test_maxLength
21
+ assert_raise(ArgumentError) { @data_bar.maxLength = :invalid_type }
22
+ assert_nothing_raised { @data_bar.maxLength = 0}
23
+ assert_equal(@data_bar.maxLength, 0)
24
+ end
25
+
26
+ def test_showValue
27
+ assert_raise(ArgumentError) { @data_bar.showValue = :invalid_type }
28
+ assert_nothing_raised { @data_bar.showValue = false}
29
+ assert_equal(@data_bar.showValue, false)
30
+ end
31
+
32
+ def test_to_xml_string
33
+ doc = Nokogiri::XML.parse(@data_bar.to_xml_string)
34
+ assert_equal(doc.xpath(".//dataBar[@minLength=10][@maxLength=90][@showValue='true']").size, 1)
35
+ assert_equal(doc.xpath(".//dataBar//cfvo").size, 2)
36
+ assert_equal(doc.xpath(".//dataBar//color").size, 1)
37
+ end
38
+
39
+ end
@@ -0,0 +1,265 @@
1
+ # encoding: UTF-8
2
+ require 'tc_helper.rb'
3
+
4
+
5
+ class TestDataValidation < Test::Unit::TestCase
6
+ def setup
7
+ #inverse defaults
8
+ @boolean_options = { :allowBlank => false, :showDropDown => true, :showErrorMessage => false, :showInputMessage => true }
9
+ @nil_options = { :formula1 => 'foo', :formula2 => 'foo', :errorTitle => 'foo', :operator => :lessThan, :prompt => 'foo', :promptTitle => 'foo', :sqref => 'foo' }
10
+ @type_option = { :type => :whole }
11
+ @error_style_option = { :errorStyle => :warning }
12
+
13
+ @string_options = { :formula1 => 'foo', :formula2 => 'foo', :error => 'foo', :errorTitle => 'foo', :prompt => 'foo', :promptTitle => 'foo', :sqref => 'foo' }
14
+ @symbol_options = { :errorStyle => :warning, :operator => :lessThan, :type => :whole}
15
+
16
+ @options = @boolean_options.merge(@nil_options).merge(@type_option).merge(@error_style_option)
17
+
18
+ @dv = Axlsx::DataValidation.new(@options)
19
+ end
20
+
21
+ def test_initialize
22
+ dv = Axlsx::DataValidation.new
23
+
24
+ @boolean_options.each do |key, value|
25
+ assert_equal(!value, dv.send(key.to_sym), "initialized default #{key} should be #{!value}")
26
+ assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
27
+ end
28
+
29
+ @nil_options.each do |key, value|
30
+ assert_equal(nil, dv.send(key.to_sym), "initialized default #{key} should be nil")
31
+ assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
32
+ end
33
+
34
+ @type_option.each do |key, value|
35
+ assert_equal(:none, dv.send(key.to_sym), "initialized default #{key} should be :none")
36
+ assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
37
+ end
38
+
39
+ @error_style_option.each do |key, value|
40
+ assert_equal(:stop, dv.send(key.to_sym), "initialized default #{key} should be :stop")
41
+ assert_equal(value, @dv.send(key.to_sym), "initialized options #{key} should be #{value}")
42
+ end
43
+ end
44
+
45
+ def test_boolean_attribute_validation
46
+ @boolean_options.each do |key, value|
47
+ assert_raise(ArgumentError, "#{key} must be boolean") { @dv.send("#{key}=".to_sym, 'A') }
48
+ assert_nothing_raised { @dv.send("#{key}=".to_sym, true) }
49
+ end
50
+ end
51
+
52
+ def test_string_attribute_validation
53
+ @string_options.each do |key, value|
54
+ assert_raise(ArgumentError, "#{key} must be string") { @dv.send("#{key}=".to_sym, :symbol) }
55
+ assert_nothing_raised { @dv.send("#{key}=".to_sym, "foo") }
56
+ end
57
+ end
58
+
59
+ def test_symbol_attribute_validation
60
+ @symbol_options.each do |key, value|
61
+ assert_raise(ArgumentError, "#{key} must be symbol") { @dv.send("#{key}=".to_sym, "foo") }
62
+ assert_nothing_raised { @dv.send("#{key}=".to_sym, value) }
63
+ end
64
+ end
65
+
66
+ def test_formula1
67
+ assert_raise(ArgumentError) { @dv.formula1 = 10 }
68
+ assert_nothing_raised { @dv.formula1 = "=SUM(A1:A1)" }
69
+ assert_equal(@dv.formula1, "=SUM(A1:A1)")
70
+ end
71
+
72
+ def test_formula2
73
+ assert_raise(ArgumentError) { @dv.formula2 = 10 }
74
+ assert_nothing_raised { @dv.formula2 = "=SUM(A1:A1)" }
75
+ assert_equal(@dv.formula2, "=SUM(A1:A1)")
76
+ end
77
+
78
+ def test_allowBlank
79
+ assert_raise(ArgumentError) { @dv.allowBlank = "foo´" }
80
+ assert_nothing_raised { @dv.allowBlank = false }
81
+ assert_equal(@dv.allowBlank, false)
82
+ end
83
+
84
+ def test_error
85
+ assert_raise(ArgumentError) { @dv.error = :symbol }
86
+ assert_nothing_raised { @dv.error = "This is a error message" }
87
+ assert_equal(@dv.error, "This is a error message")
88
+ end
89
+
90
+ def test_errorStyle
91
+ assert_raise(ArgumentError) { @dv.errorStyle = "foo" }
92
+ assert_nothing_raised { @dv.errorStyle = :information }
93
+ assert_equal(@dv.errorStyle, :information)
94
+ end
95
+
96
+ def test_errorTitle
97
+ assert_raise(ArgumentError) { @dv.errorTitle = :symbol }
98
+ assert_nothing_raised { @dv.errorTitle = "This is the error title" }
99
+ assert_equal(@dv.errorTitle, "This is the error title")
100
+ end
101
+
102
+ def test_operator
103
+ assert_raise(ArgumentError) { @dv.operator = "foo" }
104
+ assert_nothing_raised { @dv.operator = :greaterThan }
105
+ assert_equal(@dv.operator, :greaterThan)
106
+ end
107
+
108
+ def test_prompt
109
+ assert_raise(ArgumentError) { @dv.prompt = :symbol }
110
+ assert_nothing_raised { @dv.prompt = "This is a prompt message" }
111
+ assert_equal(@dv.prompt, "This is a prompt message")
112
+ end
113
+
114
+ def test_promptTitle
115
+ assert_raise(ArgumentError) { @dv.promptTitle = :symbol }
116
+ assert_nothing_raised { @dv.promptTitle = "This is the prompt title" }
117
+ assert_equal(@dv.promptTitle, "This is the prompt title")
118
+ end
119
+
120
+ def test_showDropDown
121
+ assert_raise(ArgumentError) { @dv.showDropDown = "foo´" }
122
+ assert_nothing_raised { @dv.showDropDown = false }
123
+ assert_equal(@dv.showDropDown, false)
124
+ end
125
+
126
+ def test_showErrorMessage
127
+ assert_raise(ArgumentError) { @dv.showErrorMessage = "foo´" }
128
+ assert_nothing_raised { @dv.showErrorMessage = false }
129
+ assert_equal(@dv.showErrorMessage, false)
130
+ end
131
+
132
+ def test_showInputMessage
133
+ assert_raise(ArgumentError) { @dv.showInputMessage = "foo´" }
134
+ assert_nothing_raised { @dv.showInputMessage = false }
135
+ assert_equal(@dv.showInputMessage, false)
136
+ end
137
+
138
+ def test_sqref
139
+ assert_raise(ArgumentError) { @dv.sqref = 10 }
140
+ assert_nothing_raised { @dv.sqref = "A1:A1" }
141
+ assert_equal(@dv.sqref, "A1:A1")
142
+ end
143
+
144
+ def test_type
145
+ assert_raise(ArgumentError) { @dv.type = "foo" }
146
+ assert_nothing_raised { @dv.type = :list }
147
+ assert_equal(@dv.type, :list)
148
+ end
149
+
150
+ def test_whole_decimal_data_time_textLength_to_xml
151
+ p = Axlsx::Package.new
152
+ @ws = p.workbook.add_worksheet :name=>"data_validation"
153
+ @ws.add_data_validation("A1", { :type => :whole, :operator => :between, :formula1 => '5', :formula2 => '10',
154
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values between 5 and 10',
155
+ :errorStyle => :information, :showInputMessage => true, :promptTitle => 'Be carful!',
156
+ :prompt => 'Only values between 5 and 10'})
157
+
158
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
159
+
160
+ #test attributes
161
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
162
+ [@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
163
+ [@error='Only values between 5 and 10'][@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@type='whole']
164
+ [@errorStyle='information']").size)
165
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
166
+ [@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
167
+ [@error='Only values between 5 and 10'][@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true']
168
+ [@type='whole'][@errorStyle='information']")
169
+
170
+ #test forumula1
171
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
172
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='5'")
173
+
174
+ #test forumula2
175
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula2").size)
176
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula2='10'")
177
+ end
178
+
179
+ def test_list_to_xml
180
+ p = Axlsx::Package.new
181
+ @ws = p.workbook.add_worksheet :name=>"data_validation"
182
+ @ws.add_data_validation("A1", { :type => :list, :formula1 => 'A1:A5',
183
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values from list',
184
+ :errorStyle => :stop, :showInputMessage => true, :promptTitle => 'Be carful!',
185
+ :prompt => 'Only values from list', :showDropDown => true})
186
+
187
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
188
+
189
+ #test attributes
190
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
191
+ [@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
192
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@showDropDown='true'][@type='list']
193
+ [@errorStyle='stop']").size)
194
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1']
195
+ [@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
196
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@showDropDown='true'][@type='list'][@errorStyle='stop']")
197
+
198
+ #test forumula1
199
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
200
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='A1:A5'")
201
+ end
202
+
203
+ def test_custom_to_xml
204
+ p = Axlsx::Package.new
205
+ @ws = p.workbook.add_worksheet :name=>"data_validation"
206
+ @ws.add_data_validation("A1", { :type => :custom, :formula1 => '=5/2',
207
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values corresponding formula',
208
+ :errorStyle => :stop, :showInputMessage => true, :promptTitle => 'Be carful!',
209
+ :prompt => 'Only values corresponding formula'})
210
+
211
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
212
+
213
+ #test attributes
214
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1'][@promptTitle='Be carful!']
215
+ [@prompt='Only values corresponding formula'][@errorTitle='Wrong input'][@error='Only values corresponding formula'][@showErrorMessage='true']
216
+ [@allowBlank='true'][@showInputMessage='true'][@type='custom'][@errorStyle='stop']").size)
217
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='1']/xmlns:dataValidation[@sqref='A1'][@promptTitle='Be carful!']
218
+ [@prompt='Only values corresponding formula'][@errorTitle='Wrong input'][@error='Only values corresponding formula']
219
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@type='custom'][@errorStyle='stop']")
220
+
221
+ #test forumula1
222
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1").size)
223
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations/xmlns:dataValidation/xmlns:formula1='=5/2'")
224
+ end
225
+
226
+ def test_multiple_datavalidations_to_xml
227
+ p = Axlsx::Package.new
228
+ @ws = p.workbook.add_worksheet :name=>"data_validation"
229
+ @ws.add_data_validation("A1", { :type => :whole, :operator => :between, :formula1 => '5', :formula2 => '10',
230
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values between 5 and 10',
231
+ :errorStyle => :information, :showInputMessage => true, :promptTitle => 'Be carful!',
232
+ :prompt => 'Only values between 5 and 10'})
233
+ @ws.add_data_validation("B1", { :type => :list, :formula1 => 'A1:A5',
234
+ :showErrorMessage => true, :errorTitle => 'Wrong input', :error => 'Only values from list',
235
+ :errorStyle => :stop, :showInputMessage => true, :promptTitle => 'Be carful!',
236
+ :prompt => 'Only values from list', :showDropDown => true})
237
+
238
+ doc = Nokogiri::XML.parse(@ws.to_xml_string)
239
+
240
+ #test attributes
241
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='A1']
242
+ [@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
243
+ [@error='Only values between 5 and 10'][@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@type='whole']
244
+ [@errorStyle='information']").size)
245
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='A1']
246
+ [@promptTitle='Be carful!'][@prompt='Only values between 5 and 10'][@operator='between'][@errorTitle='Wrong input']
247
+ [@error='Only values between 5 and 10'][@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true']
248
+ [@type='whole'][@errorStyle='information']")
249
+
250
+ #test attributes
251
+ assert_equal(1, doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='B1']
252
+ [@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
253
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@showDropDown='true'][@type='list']
254
+ [@errorStyle='stop']").size)
255
+ assert doc.xpath("//xmlns:worksheet/xmlns:dataValidations[@count='2']/xmlns:dataValidation[@sqref='B1']
256
+ [@promptTitle='Be carful!'][@prompt='Only values from list'][@errorTitle='Wrong input'][@error='Only values from list']
257
+ [@showErrorMessage='true'][@allowBlank='true'][@showInputMessage='true'][@showDropDown='true'][@type='list'][@errorStyle='stop']")
258
+ end
259
+
260
+ def test_empty_attributes
261
+ v = Axlsx::DataValidation.new
262
+ assert_equal(nil, v.send(:get_valid_attributes))
263
+
264
+ end
265
+ end
@@ -111,12 +111,18 @@ class TestDateTimeConverter < Test::Unit::TestCase
111
111
  end
112
112
 
113
113
  def test_timezone
114
+
114
115
  utc = Time.utc 2012 # January 1st, 2012 at 0:00 UTC
115
- local = begin
116
- Time.new 2012, 1, 1, 1, 0, 0, 3600 # January 1st, 2012 at 1:00 GMT+1
117
- rescue ArgumentError
118
- Time.parse "2012-01-01 01:00:00 +0100"
119
- end
116
+
117
+ # JRuby makes no assumption on time zone. randym
118
+ #local = begin
119
+ # Time.new 2012, 1, 1, 1, 0, 0, 3600 # January 1st, 2012 at 1:00 GMT+1
120
+ #rescue ArgumentError
121
+ # Time.parse "2012-01-01 01:00:00 +0100"
122
+ #end
123
+
124
+ local = Time.parse "2012-01-01 01:00:00 +0100"
125
+
120
126
  assert_equal local, utc
121
127
  assert_equal Axlsx::DateTimeConverter::time_to_serial(local), Axlsx::DateTimeConverter::time_to_serial(utc)
122
128
  Axlsx::Workbook.date1904 = true
@@ -0,0 +1,45 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestIconSet < Test::Unit::TestCase
4
+ def setup
5
+ @icon_set = Axlsx::IconSet.new
6
+ end
7
+
8
+ def test_defaults
9
+ assert_equal @icon_set.iconSet, "3TrafficLights1"
10
+ assert_equal @icon_set.percent, true
11
+ assert_equal @icon_set.reverse, false
12
+ assert_equal @icon_set.showValue, true
13
+ end
14
+
15
+ def test_icon_set
16
+ assert_raise(ArgumentError) { @icon_set.iconSet = "invalid_value" }
17
+ assert_nothing_raised { @icon_set.iconSet = "5Rating"}
18
+ assert_equal(@icon_set.iconSet, "5Rating")
19
+ end
20
+
21
+ def test_percent
22
+ assert_raise(ArgumentError) { @icon_set.percent = :invalid_type }
23
+ assert_nothing_raised { @icon_set.percent = false}
24
+ assert_equal(@icon_set.percent, false)
25
+ end
26
+
27
+ def test_showValue
28
+ assert_raise(ArgumentError) { @icon_set.showValue = :invalid_type }
29
+ assert_nothing_raised { @icon_set.showValue = false}
30
+ assert_equal(@icon_set.showValue, false)
31
+ end
32
+
33
+ def test_reverse
34
+ assert_raise(ArgumentError) { @icon_set.reverse = :invalid_type }
35
+ assert_nothing_raised { @icon_set.reverse = false}
36
+ assert_equal(@icon_set.reverse, false)
37
+ end
38
+
39
+ def test_to_xml_string
40
+ doc = Nokogiri::XML.parse(@icon_set.to_xml_string)
41
+ assert_equal(doc.xpath(".//iconSet[@iconSet='3TrafficLights1'][@percent='true'][@reverse='false'][@showValue='true']").size, 1)
42
+ assert_equal(doc.xpath(".//iconSet//cfvo").size, 3)
43
+ end
44
+
45
+ end