fdlint 0.1.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 (218) hide show
  1. data/Gemfile +8 -0
  2. data/Gemfile.lock +14 -0
  3. data/README.md +68 -0
  4. data/Rakefile +92 -0
  5. data/bin/fdlint +17 -0
  6. data/lib/base_parser.rb +143 -0
  7. data/lib/cmd_runner.rb +145 -0
  8. data/lib/context.rb +31 -0
  9. data/lib/css/parser.rb +186 -0
  10. data/lib/css/reader.rb +30 -0
  11. data/lib/css/rule/check_compression_rule.rb +48 -0
  12. data/lib/css/rule/checklist.rb +45 -0
  13. data/lib/css/struct.rb +111 -0
  14. data/lib/encoding_error.rb +6 -0
  15. data/lib/file_validator.rb +38 -0
  16. data/lib/helper/code_type.rb +50 -0
  17. data/lib/helper/color_string.rb +44 -0
  18. data/lib/helper/file_reader.rb +22 -0
  19. data/lib/helper/strenc.rb +65 -0
  20. data/lib/html/parser.rb +212 -0
  21. data/lib/html/query.rb +96 -0
  22. data/lib/html/rule/check_tag_rule.rb +80 -0
  23. data/lib/html/struct.rb +291 -0
  24. data/lib/js/expr/expr.rb +66 -0
  25. data/lib/js/expr/left_hand.rb +63 -0
  26. data/lib/js/expr/operate.rb +92 -0
  27. data/lib/js/expr/primary.rb +166 -0
  28. data/lib/js/parser.rb +116 -0
  29. data/lib/js/rule/all.rb +35 -0
  30. data/lib/js/rule/checklist.rb +41 -0
  31. data/lib/js/rule/file_checker.rb +42 -0
  32. data/lib/js/rule/helper.rb +96 -0
  33. data/lib/js/rule/no_global.rb +87 -0
  34. data/lib/js/stat/if.rb +25 -0
  35. data/lib/js/stat/iter.rb +85 -0
  36. data/lib/js/stat/stat.rb +117 -0
  37. data/lib/js/stat/switch.rb +65 -0
  38. data/lib/js/stat/try.rb +28 -0
  39. data/lib/js/stat/var.rb +40 -0
  40. data/lib/js/struct.rb +248 -0
  41. data/lib/log_entry.rb +49 -0
  42. data/lib/node.rb +28 -0
  43. data/lib/parse_error.rb +13 -0
  44. data/lib/parser_visitable.rb +138 -0
  45. data/lib/position_info.rb +46 -0
  46. data/lib/printer/base_printer.rb +24 -0
  47. data/lib/printer/console_printer.rb +66 -0
  48. data/lib/printer/nocolor_printer.rb +27 -0
  49. data/lib/printer/vim_printer.rb +19 -0
  50. data/lib/rule.rb +241 -0
  51. data/lib/rule_helper.rb +14 -0
  52. data/lib/runner.rb +225 -0
  53. data/rules.d/css.rule +127 -0
  54. data/rules.d/html.dtd.rule +22 -0
  55. data/rules.d/html.prop.rule +51 -0
  56. data/rules.d/html.tag.rule +136 -0
  57. data/rules.d/js.file.rule +13 -0
  58. data/rules.d/js.jquery.rule +56 -0
  59. data/rules.d/js.mergefile.rule +71 -0
  60. data/rules.d/js.rule +84 -0
  61. data/test/all_tests.rb +84 -0
  62. data/test/cli/cli_test.rb +70 -0
  63. data/test/cli/log_level_test.rb +51 -0
  64. data/test/cli/output_format_test.rb +47 -0
  65. data/test/cli/type_test.rb +77 -0
  66. data/test/css/mac_line_end_support_test.rb +38 -0
  67. data/test/css/parser_test.rb +276 -0
  68. data/test/css/rule/check_encoding_test.rb +66 -0
  69. data/test/css/rule/check_list_rule_test.rb +167 -0
  70. data/test/css/rule/compression_test.rb +53 -0
  71. data/test/css/rule/file_name_test.rb +76 -0
  72. data/test/fixtures/css/broken.css +4 -0
  73. data/test/fixtures/css/cbu/36.css +52 -0
  74. data/test/fixtures/css/cbu/china_top.css +324 -0
  75. data/test/fixtures/css/cbu/default-merge.css +3 -0
  76. data/test/fixtures/css/cbu/default.css +13 -0
  77. data/test/fixtures/css/cbu/diy-merge.css +25 -0
  78. data/test/fixtures/css/cbu/fns-v1.css +27 -0
  79. data/test/fixtures/css/cbu/index_v0.1.css +12 -0
  80. data/test/fixtures/css/cbu/merge.css +11 -0
  81. data/test/fixtures/css/cbu/min.css +2 -0
  82. data/test/fixtures/css/cbu/my_home_admin.css +126 -0
  83. data/test/fixtures/css/cbu/nav.css +95 -0
  84. data/test/fixtures/css/cbu/pic_list.css +386 -0
  85. data/test/fixtures/css/cbu/quote-edit.css +18 -0
  86. data/test/fixtures/css/cbu/selloffer.shopwindow.css +1 -0
  87. data/test/fixtures/css/cbu/v1.css +9 -0
  88. data/test/fixtures/css/css3.css +30 -0
  89. data/test/fixtures/css/empty-min.css +0 -0
  90. data/test/fixtures/css/empty.css +0 -0
  91. data/test/fixtures/css/font-family.css +4 -0
  92. data/test/fixtures/css/gb-good.css +14 -0
  93. data/test/fixtures/css/gb_using_star.css +4 -0
  94. data/test/fixtures/css/import.css +18 -0
  95. data/test/fixtures/css/mac-line-sep-err-min.css +1 -0
  96. data/test/fixtures/css/mac-line-sep-err.css +1 -0
  97. data/test/fixtures/css/mac-line-sep-good-min.css +1 -0
  98. data/test/fixtures/css/mac-line-sep-good.css +1 -0
  99. data/test/fixtures/css/multi-encoding-in-a-file.css +0 -0
  100. data/test/fixtures/css/simple.css +1 -0
  101. data/test/fixtures/css/using_expr.css +8 -0
  102. data/test/fixtures/css/using_hack.css +21 -0
  103. data/test/fixtures/css/using_id.css +1 -0
  104. data/test/fixtures/css/using_star.css +4 -0
  105. data/test/fixtures/css/utf8_good.css +6 -0
  106. data/test/fixtures/css/utf8_good_declaring_charset.css +7 -0
  107. data/test/fixtures/css/utf8_using_star.css +5 -0
  108. data/test/fixtures/html/1-1.html +120 -0
  109. data/test/fixtures/html/1-2.html +120 -0
  110. data/test/fixtures/html/cms.html +373 -0
  111. data/test/fixtures/html/css_out_of_head.html +9 -0
  112. data/test/fixtures/html/fdev-template.html +22 -0
  113. data/test/fixtures/html/google.com.html +33 -0
  114. data/test/fixtures/html/mixed_log_levels.html +4 -0
  115. data/test/fixtures/html/mixed_types.html +13 -0
  116. data/test/fixtures/html/no_dtd.html +6 -0
  117. data/test/fixtures/html/readme.html +94 -0
  118. data/test/fixtures/html/review.board.html +163 -0
  119. data/test/fixtures/html/syntax_err.html +3 -0
  120. data/test/fixtures/html/train/detail/345/233/276/346/226/207/347/273/223/345/220/210.html +208 -0
  121. data/test/fixtures/html/train/detail/347/232/204Flash.html +212 -0
  122. data/test/fixtures/html/train/detail/347/232/204Vedio.html +212 -0
  123. data/test/fixtures/html/train/index.html +37 -0
  124. data/test/fixtures/html/train/test.html +1 -0
  125. data/test/fixtures/html/train//344/277/256/346/224/271/344/270/200/347/272/247/345/210/206/347/261/273.html +112 -0
  126. data/test/fixtures/html/train//344/277/256/346/224/271/345/255/220/345/210/206/347/261/273.html +108 -0
  127. data/test/fixtures/html/train//344/277/256/346/224/271/350/257/276/347/250/213.html +195 -0
  128. data/test/fixtures/html/train//345/215/232/345/256/242/350/256/276/347/275/256.html +142 -0
  129. data/test/fixtures/html/train//346/265/217/350/247/210/350/256/260/345/275/225.html +191 -0
  130. data/test/fixtures/html/train//346/267/273/345/212/240/344/270/200/347/272/247/345/210/206/347/261/273.html +113 -0
  131. data/test/fixtures/html/train//346/267/273/345/212/240/345/255/220/345/210/206/347/261/273.html +112 -0
  132. data/test/fixtures/html/train//346/267/273/345/212/240/350/257/276/347/250/213.html +195 -0
  133. data/test/fixtures/html/train//347/231/273/345/275/225.html +20 -0
  134. data/test/fixtures/html/train//347/256/241/347/220/206/345/210/206/347/261/273.html +210 -0
  135. data/test/fixtures/html/train//347/256/241/347/220/206/345/217/215/351/246/210.html +222 -0
  136. data/test/fixtures/html/train//347/256/241/347/220/206/350/257/276/347/250/213.html +284 -0
  137. data/test/fixtures/html/train//347/256/241/347/220/206/350/264/246/346/210/267.html +107 -0
  138. data/test/fixtures/html/train//347/275/221/344/270/212/345/237/271/350/256/255home/351/241/265.html +354 -0
  139. data/test/fixtures/html/train//347/275/221/345/225/206/345/237/271/350/256/255list/351/241/265.html +255 -0
  140. data/test/fixtures/html/train//350/256/276/347/275/256/351/246/226/351/241/265/346/216/250/350/215/220.html +168 -0
  141. data/test/fixtures/html/train//350/257/264/346/230/216.txt +3 -0
  142. data/test/fixtures/html/train//351/246/226/351/241/265/345/271/277/345/221/212/350/256/276/347/275/256.html +297 -0
  143. data/test/fixtures/html/unescaped.html +2 -0
  144. data/test/fixtures/html/view.vm +916 -0
  145. data/test/fixtures/js/jquery-1.7.js +9300 -0
  146. data/test/fixtures/js/scope-test.js +22 -0
  147. data/test/helper.rb +41 -0
  148. data/test/html/mixed_type_test.rb +35 -0
  149. data/test/html/parser/parse_comment_test.rb +47 -0
  150. data/test/html/parser/parse_dtd_test.rb +46 -0
  151. data/test/html/parser/parse_script_tag_test.rb +55 -0
  152. data/test/html/parser/parse_with_auto_close_tag_test.rb +41 -0
  153. data/test/html/parser/parse_with_diff_case_test.rb +38 -0
  154. data/test/html/parser/parse_with_emtpy_test.rb +22 -0
  155. data/test/html/parser/parse_with_multi_children_test.rb +27 -0
  156. data/test/html/parser/parse_with_multi_line_test.rb +41 -0
  157. data/test/html/parser/parse_with_prop_test.rb +88 -0
  158. data/test/html/parser/parse_with_script_tag_test.rb +26 -0
  159. data/test/html/parser/parse_with_selfclosing_test.rb +39 -0
  160. data/test/html/parser/parse_with_simple_tag_test.rb +44 -0
  161. data/test/html/parser/parse_with_simple_tree_test.rb +40 -0
  162. data/test/html/parser/parse_with_style_tag_test.rb +22 -0
  163. data/test/html/parser/parse_with_text_test.rb +45 -0
  164. data/test/html/parser_test.rb +52 -0
  165. data/test/html/query_test.rb +52 -0
  166. data/test/html/rule/check_block_level_element_test.rb +52 -0
  167. data/test/html/rule/check_button_test.rb +45 -0
  168. data/test/html/rule/check_class_count_test.rb +36 -0
  169. data/test/html/rule/check_css_in_head_test.rb +53 -0
  170. data/test/html/rule/check_dtd_test.rb +46 -0
  171. data/test/html/rule/check_form_element_name_test.rb +49 -0
  172. data/test/html/rule/check_head_contain_meta_and_title_test.rb +52 -0
  173. data/test/html/rule/check_html_template_test.rb +103 -0
  174. data/test/html/rule/check_hyperlink_with_target_test.rb +40 -0
  175. data/test/html/rule/check_hyperlink_with_title_test.rb +43 -0
  176. data/test/html/rule/check_id_n_class_downcase_test.rb +40 -0
  177. data/test/html/rule/check_img_with_alt_prop_test.rb +33 -0
  178. data/test/html/rule/check_no_import_css_test.rb +36 -0
  179. data/test/html/rule/check_prop_have_value_test.rb +32 -0
  180. data/test/html/rule/check_prop_seperator_test.rb +32 -0
  181. data/test/html/rule/check_style_prop_test.rb +30 -0
  182. data/test/html/rule/check_tag_closed_test.rb +59 -0
  183. data/test/html/rule/check_tag_downcase_test.rb +51 -0
  184. data/test/html/rule/check_unescape_char_test.rb +35 -0
  185. data/test/html/rule/check_unique_import_test.rb +56 -0
  186. data/test/html/rule_test.rb +62 -0
  187. data/test/js/expr/expr.rb +57 -0
  188. data/test/js/expr/left_hand.rb +25 -0
  189. data/test/js/expr/operate.rb +145 -0
  190. data/test/js/expr/primary.rb +89 -0
  191. data/test/js/parser_test.rb +98 -0
  192. data/test/js/rule/alert_check_test.rb +37 -0
  193. data/test/js/rule/all_test.rb +23 -0
  194. data/test/js/rule/base_test.rb +34 -0
  195. data/test/js/rule/file_checker_test.rb +131 -0
  196. data/test/js/rule/jq_check_test.rb +90 -0
  197. data/test/js/rule/nest_try_catch_test.rb +71 -0
  198. data/test/js/rule/new_object_and_new_array_test.rb +38 -0
  199. data/test/js/rule/no_eval_test.rb +34 -0
  200. data/test/js/rule/no_global_test.rb +88 -0
  201. data/test/js/rule/private_method_check_test.rb +58 -0
  202. data/test/js/rule/semicolon_test.rb +63 -0
  203. data/test/js/rule/stat_if_with_brace_test.rb +68 -0
  204. data/test/js/rule/stat_if_with_muti_else_test.rb +68 -0
  205. data/test/js/rule/use_strict_equal_test.rb +44 -0
  206. data/test/js/rule_test.rb +47 -0
  207. data/test/js/stat/if.rb +26 -0
  208. data/test/js/stat/iter.rb +115 -0
  209. data/test/js/stat/stat.rb +91 -0
  210. data/test/js/stat/switch.rb +37 -0
  211. data/test/js/stat/try.rb +32 -0
  212. data/test/js/stat/var.rb +38 -0
  213. data/test/parser_visitable_test.rb +102 -0
  214. data/test/position_info_test.rb +66 -0
  215. data/test/rule_dsl/dsl_basic_test.rb +91 -0
  216. data/test/rule_dsl/importing_test.rb +48 -0
  217. data/test/runner/log_level_test.rb +58 -0
  218. metadata +317 -0
@@ -0,0 +1,22 @@
1
+ require_relative '../../helper'
2
+
3
+ module XRayTest
4
+ module HTML
5
+ module Parser
6
+
7
+ class ParseWithStyleTagTest < Test::Unit::TestCase
8
+
9
+ include XRay::HTML
10
+
11
+ def test_parse_style
12
+ text = %q(<style id=gstyle>body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-top:10px;margin-bottom:20px}body,td,a,p,.h{font-family:arial,sans-serif}.h{color:#36c}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}em{color:#c03;font-style:normal;font-weight:normal}a em{text-decoration:underline}.lst{height:25px;width:496px}#lst-ib:hover{border-color:#a0a0a0 #b9b9b9 #b9b9b9 #b9b9b9!important;}#lst-ib.lst-d-f,#lst-ib:hover.lst-d-f{border-color:#4d90fe!important;}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:-moz-inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}.jhp input[type="submit"],.gssb_c input,.gac_bt input{background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);-webkit-border-radius:2px;-webkit-user-select:none;background-color:#f5f5f5;background-image:linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;border:1px solid rgba(0, 0, 0, 0.1);border-radius:2px;color:#666;cursor:pointer;font-size:11px;font-weight:bold;height:29px;line-height:27px;margin:11px 6px;min-width:54px;padding:0 8px;text-align:center}.jhp input[type="submit"]:hover,.gssb_c input:hover,.gac_bt input:hover{background-image:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),to(#f1f1f1));background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);background-color:#f8f8f8;background-image:linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;box-shadow:0 1px 1px rgba(0,0,0,0.1);color:#333}.jhp input[type="submit"]:focus,.gssb_c input:focus,.gac_bt input:focus{border:1px solid #4d90fe;outline:none}.gssb_c input,.gac_bt input{margin:6px;}input{font-family:inherit}.lsb:active,.gac_sb:active{background:-webkit-gradient(linear,left top,left bottom,from(#ccc),to(#ddd))}a.gb1,a.gb2,a.gb3,a.gb4{color:#11c !important}#gog{background:#fff}#gbar,#guser{font-size:13px;padding-top:1px !important}#gbar{float:left;height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#gbs,.gbm{background:#fff;left:0;position:absolute;text-align:left;visibility:hidden;z-index:1000}.gbm{border:1px solid;border-color:#c9d7f1 #36c #36c #a2bae7;z-index:1001}.gb1{margin-right:.5em}.gb1,.gb3{zoom:1}.gb2{display:block;padding:.2em .5em}.gb2,.gb3{text-decoration:none !important;border-bottom:none}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb2,a.gb3,a.gb4{color:#00c !important}a.gb2:hover{background:#36c;color:#fff !important}#gbar .gbz0l{color:#000 !important;cursor:default;font-weight:bold;text-decoration:none !important}body{background:#fff;color:black}input{-moz-box-sizing:content-box}a{color:#11c;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#36c}a:visited{color:#551a8b}a.gb1,a.gb4{text-decoration:underline}a.gb3:hover{text-decoration:none}#ghead a.gb2:hover{color:#fff!important}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px;}.lsbb{height:30px;display:block}.ftl,#footer a{color:#2200c1;}#fll a, .ftl{margin: 0 8px;}#fll{display:inline}.lsb{border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#ccc}.lst:focus{outline:none}#addlang a{padding:0 3px}.gac_v div{display:none}.gac_v .gac_v2,.gac_bt{display:block!important}#footer{color:#666;font-size:10pt;min-height:49px;min-width:780px;position:relative}#footer #cp-sol{margin-right:52px;}</style>)
13
+ XRay::HTML::Parser.parse(text) do |e|
14
+ assert_equal text, e.outer_html
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,45 @@
1
+ require_relative '../../helper'
2
+
3
+ module XRayTest
4
+ module HTML
5
+ module Parser
6
+
7
+ class ParseWithTextTest < Test::Unit::TestCase
8
+
9
+ include XRay::HTML
10
+
11
+ def setup
12
+ @parser = XRay::HTML::Parser.new('information')
13
+ @element = @parser.parse
14
+ end
15
+
16
+ def test_type_is_element
17
+ assert @element.is_a?(TextElement)
18
+ end
19
+
20
+ def test_have_no_child
21
+ assert_equal 0, @element.children.length
22
+ end
23
+
24
+ def test_has_text
25
+ assert_equal 'information', @element.inner_text
26
+ end
27
+
28
+ def test_has_html_text
29
+ assert_equal 'information', @element.inner_html
30
+ assert_equal 'information', @element.outer_html
31
+ end
32
+
33
+ def test_with_lt_mark
34
+ assert_equal TextElement.new('1 < 3 > 2'), XRay::HTML::Parser.parse('1 < 3 > 2')
35
+ end
36
+
37
+ def test_with_and_mark
38
+ assert_equal TextElement.new('1 &lt; 3 &gt; 2'), XRay::HTML::Parser.parse('1 &lt; 3 &gt; 2')
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,52 @@
1
+ gem 'test-unit' if defined? gem
2
+ require 'test/unit'
3
+ require 'test/unit/testsuite'
4
+ require 'test/unit/ui/console/testrunner'
5
+
6
+ require_relative 'parser/parse_comment_test'
7
+ require_relative 'parser/parse_with_auto_close_tag_test'
8
+ require_relative 'parser/parse_with_emtpy_test'
9
+ require_relative 'parser/parse_with_multi_children_test'
10
+ require_relative 'parser/parse_with_multi_line_test'
11
+ require_relative 'parser/parse_with_simple_tag_test'
12
+ require_relative 'parser/parse_with_simple_tree_test'
13
+ require_relative 'parser/parse_with_selfclosing_test'
14
+ require_relative 'parser/parse_with_text_test'
15
+ require_relative 'parser/parse_with_prop_test'
16
+ require_relative 'parser/parse_with_script_tag_test'
17
+ require_relative 'parser/parse_with_style_tag_test'
18
+ require_relative 'parser/parse_with_diff_case_test'
19
+ require_relative 'parser/parse_dtd_test'
20
+ require_relative 'parser/parse_script_tag_test'
21
+
22
+ module XRayTest
23
+
24
+ module HTML
25
+
26
+ class ParserTest < Test::Unit::TestSuite
27
+
28
+ def self.suite
29
+ tests = Test::Unit::TestSuite.new
30
+ tests << Parser::ParseCommentTest.suite
31
+ tests << Parser::ParseWithAutoCloseTagTest.suite
32
+ tests << Parser::ParseWithEmptyTest.suite
33
+ tests << Parser::ParseWithMultiChildrenTest.suite
34
+ tests << Parser::ParseWithMultiLineTest.suite
35
+ tests << Parser::ParseWithSelfClosingTagTest.suite
36
+ tests << Parser::ParseWithSimpleTagTest.suite
37
+ tests << Parser::ParseWithSimpleTreeTest.suite
38
+ tests << Parser::ParsePropertyTest.suite
39
+ tests << Parser::ParseWithTextTest.suite
40
+ tests << Parser::ParseWithScriptTagTest.suite
41
+ tests << Parser::ParseWithStyleTagTest.suite
42
+ tests << Parser::ParseWithDiffCaseTest.suite
43
+ tests << Parser::ParseDTDTest.suite
44
+ tests << Parser::ParseScriptTagTest.suite
45
+ tests
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ Test::Unit::UI::Console::TestRunner.run( XRayTest::HTML::ParserTest ) if __FILE__ == $0
52
+
@@ -0,0 +1,52 @@
1
+ require_relative '../helper'
2
+ require 'html/parser'
3
+ require 'html/query'
4
+
5
+ module XRayTest
6
+ module HTML
7
+
8
+ class QueryTest < Test::Unit::TestCase
9
+
10
+ include XRay::HTML
11
+
12
+ def test_query_with_tag_name
13
+ assert Element.new('div') === 'div'
14
+ assert Element.new('a', {:href=>'#'}) === 'a'
15
+ end
16
+
17
+ def test_query_with_id
18
+ assert Element.new('div', { :id => 'info' }) === '#info'
19
+ assert Element.new('div', { :id => 'info' }) === 'div#info'
20
+ end
21
+
22
+ def test_query_with_class
23
+ assert Element.new('div', { :class => 'info' }) === '.info'
24
+ assert Element.new('div', { :id => 'info-1', :class => 'info' }) === '#info-1.info'
25
+ assert Element.new('div', { :id => 'info-1', :class => 'info' }) === '.info#info-1'
26
+ assert Element.new('div', { :id => 'info-1', :class => 'info' }) === 'div.info#info-1'
27
+ end
28
+
29
+ def test_query_with_prop
30
+ assert Element.new('div', { :class => 'info' }) === 'div[class==info]'
31
+ end
32
+
33
+ def test_deep_query
34
+ el = ::XRay::HTML::Parser.parse(%Q{<div class="mod">
35
+ <div>
36
+ <ul>
37
+ <li></li>
38
+ <li></li>
39
+ </ul>
40
+ </div>
41
+ </div>})
42
+
43
+ assert_equal 2, el.query('li').length
44
+ assert_equal 2, el.query('div').length
45
+ assert_equal 1, el.query('ul').length
46
+ assert_equal 5, el.query('*').length
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckBlockLevelElementTest < Test::Unit::TestCase
11
+
12
+ include XRay::HTML
13
+
14
+ def setup
15
+ @rule = XRay::HTML::Rule::CheckTagRule.new
16
+ end
17
+
18
+ def test_check_normal
19
+ tag = Element.new('div', nil, [
20
+ Element.new('span', nil, [
21
+ TextElement.new('good day, commander!')
22
+ ])
23
+ ])
24
+ assert_equal [], @rule.check_html_tag(tag)
25
+ end
26
+
27
+ def test_check_block_in_inline
28
+ tag = Element.new('span', nil, [
29
+ Element.new('div', nil, [
30
+ TextElement.new('good day, commander!')
31
+ ])
32
+ ])
33
+ assert_equal [["行内标签不得包含块级标签,a标签例外", :error]], @rule.check_html_tag(tag)
34
+ end
35
+
36
+ def test_check_inline_inline_block
37
+ tag = Element.new('span', nil, [
38
+ Element.new('span', nil, [
39
+ Element.new('div', nil, [
40
+ TextElement.new('good day, commander!')
41
+ ])
42
+ ])
43
+ ])
44
+ assert_equal [], @rule.check_html_tag(tag)
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckButtonTest < Test::Unit::TestCase
11
+
12
+ include XRay::HTML
13
+
14
+ def setup
15
+ @rule = XRay::HTML::Rule::CheckTagRule.new
16
+ end
17
+
18
+ def test_check_normal
19
+ src = %q(<button type="button" name="usernmae" />
20
+ <button type="submit" name="male" />
21
+ <button type="reset" name="food" />)
22
+ XRay::HTML::Parser.parse(src).each do |tag|
23
+ assert_equal [], @rule.check_html_tag(tag)
24
+ end
25
+ end
26
+
27
+ def test_check_missing_name
28
+ src = %q(<input type="button" value="btn" />
29
+ <input type="submit" name="submit" value="submit"/>
30
+ <input type="reset" />)
31
+ XRay::HTML::Parser.parse(src).each do |tag|
32
+ unless tag.is_a? TextElement
33
+ assert_equal [["所有按钮必须用button(button/submit/reset)", :error]], @rule.check_html_tag(tag)
34
+ end
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckClassCountTest < Test::Unit::TestCase
11
+
12
+ def setup
13
+ @rule = XRay::HTML::Rule::CheckTagRule.new
14
+ end
15
+
16
+ def test_check_normal
17
+ prop = XRay::HTML::Property.new('class', 'info')
18
+ assert_equal [], @rule.check_html_property(prop)
19
+ end
20
+
21
+ def test_check_too_many_classes
22
+ prop = XRay::HTML::Property.new('class', 'info new red bigger')
23
+ expected = ["一个节点上定义的class个数最多不超过3个(不含lib中的class)", :error]
24
+ assert_equal [expected], @rule.check_html_property(prop)
25
+ end
26
+
27
+ def test_check_filter_fdev_classes
28
+ prop = XRay::HTML::Property.new('class', 'info new red fd-main w952 layout grid layout- grid-')
29
+ assert_equal [], @rule.check_html_property(prop)
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckCSSInHeadTest < Test::Unit::TestCase
11
+
12
+ def setup
13
+ @rule = XRay::HTML::Rule::CheckTagRule.new
14
+ end
15
+
16
+ def test_check_alone_css_tag
17
+ tag = css_link('test.css')
18
+ assert_equal [], @rule.check_html_tag(tag)
19
+ end
20
+
21
+ def test_check_css_tag_in_head
22
+ tag = css_link('test.css')
23
+ head = XRay::HTML::Element.new('head', nil, [tag])
24
+ assert_equal [], @rule.check_html_tag(tag)
25
+ end
26
+
27
+ def test_check_css_tag_in_body
28
+ tag = css_link('test.css')
29
+ body = XRay::HTML::Element.new('body', nil, [tag])
30
+ assert_equal [["外链CSS置于head里(例外:应用里的footer样式)", :warn]], @rule.check_html_tag(tag)
31
+ end
32
+
33
+ def test_from_fixture
34
+ results = XRay::Runner.new.check_html( fixture "html/css_out_of_head.html" )
35
+ found = results.find_all do |res|
36
+ res.message == "外链CSS置于head里(例外:应用里的footer样式)"
37
+ end
38
+ assert_equal 1, found.size
39
+ end
40
+
41
+ protected
42
+ def css_link(src)
43
+ XRay::HTML::Element.new('link', {:rel => 'stylesheet', :href=>src}, [], :self)
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckDTDTest < Test::Unit::TestCase
11
+
12
+ def setup
13
+ @rule = XRay::HTML::Rule::CheckTagRule.new
14
+ end
15
+
16
+ def test_check_html5_dtd
17
+ tag = XRay::HTML::DTDElement.new('html')
18
+ assert_equal [], @rule.check_html_dtd(tag)
19
+ end
20
+
21
+ def test_check_xhtml_dtd
22
+ src = %q(html
23
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
24
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd")
25
+ tag = XRay::HTML::DTDElement.new(src)
26
+ assert_equal [['新页面统一使用HTML 5 DTD', :warn]], @rule.check_html_dtd(tag)
27
+ end
28
+
29
+ def test_check_doctype_upcase
30
+ tag = XRay::HTML::DTDElement.new('html', 'doctype')
31
+ assert_equal [['必须使用大写的"DOCTYPE"', :warn]], @rule.check_html_dtd(tag)
32
+ end
33
+
34
+ def test_check_dtd_available
35
+ doc = XRay::HTML::Parser.new('<html><body></body></html>')
36
+ assert @rule.check_html_doc(doc).include?(['必须存在文档类型声明', :error])
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+
45
+
46
+
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckFormElementNameTest < Test::Unit::TestCase
11
+
12
+ include XRay::HTML
13
+
14
+ def setup
15
+ @rule = XRay::HTML::Rule::CheckTagRule.new
16
+ end
17
+
18
+ def test_check_normal
19
+ src = %q(<input type="text" name="usernmae" />
20
+ <input type="radio" name="male" />
21
+ <input type="checkbox" name="food" />
22
+ <textarea name="bio">test</textarea>
23
+ <select name="city"></select>)
24
+ XRay::HTML::Parser.parse(src).each do |tag|
25
+ assert_equal [], @rule.check_html_tag(tag)
26
+ end
27
+ end
28
+
29
+ def test_check_missing_name
30
+ src = %q(<input type="text" />
31
+ <input type="radio" name="" />
32
+ <input type="checkbox" />
33
+ <textarea>test</textarea>
34
+ <select></select>)
35
+ XRay::HTML::Parser.parse(src).each do |tag|
36
+ unless tag.is_a? TextElement
37
+ assert_equal [["text、radio、checkbox、textarea、select必须加name属性", :error]], @rule.check_html_tag(tag)
38
+ end
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+
48
+
49
+
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckHeadTest < Test::Unit::TestCase
11
+
12
+ include XRay::HTML
13
+
14
+ def setup
15
+ @rule = XRay::HTML::Rule::CheckTagRule.new
16
+ @expect = ["head必须包含字符集meta和title", :error]
17
+ end
18
+
19
+ def test_check_right_tag
20
+ tag = XRay::HTML::Element.new('head',nil, [
21
+ Element.new('meta', {:charset => 'utf-8'}),
22
+ Element.new('title', nil, [TextElement.new('hello world!')]),
23
+ Element.new('meta', {:name => 'description'}),
24
+ Element.new('meta', {:name => 'keywords'})
25
+ ])
26
+ assert_equal [], @rule.check_html_tag(tag)
27
+ end
28
+
29
+ def test_check_simple_head
30
+ tag = XRay::HTML::Element.new('head')
31
+ assert @rule.check_html_tag(tag).include?(@expect)
32
+ end
33
+
34
+ def test_check_head_without_meta
35
+ tag = XRay::HTML::Element.new('head',nil, [
36
+ Element.new('title', nil, [TextElement.new('hello world!')])
37
+ ])
38
+ assert @rule.check_html_tag(tag).include?(@expect)
39
+ end
40
+
41
+ def test_check_head_without_title
42
+ tag = XRay::HTML::Element.new('head',nil, [
43
+ Element.new('meta', {:charset => 'utf-8'})
44
+ ])
45
+ assert @rule.check_html_tag(tag).include?(@expect)
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,103 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckHTMLTemplateTest < Test::Unit::TestCase
11
+
12
+ include XRay::HTML
13
+
14
+ def setup
15
+ @rule = XRay::HTML::Rule::CheckTagRule.new
16
+ @head = %Q(<head>
17
+ <meta charset="gbk"/>
18
+ <title>阿里巴巴</title>
19
+ <mea name="description" content="阿里巴巴批发大市场"/>
20
+ <meta name="keywords" content="阿里巴巴,采购批发,1688,行业门户,网上贸易,b2b,电子商务"/>
21
+ <link href="产品线merge.css" rel="stylesheet"/>
22
+ <link href="页面merge.css" rel="stylesheet"/>
23
+ <script src="产品线merge.js"></script>
24
+ <base target="_blank"/>
25
+ </head>)
26
+ @doc = %Q(<div id="doc">
27
+ <div id="alibar">alibar</div>
28
+ <div id="header" class="w952">header</div>
29
+ <div id="content" class="w952">content</div>
30
+ <div id="footer">footer</div>
31
+ </div>)
32
+ @body = %Q(<body>
33
+ #{@doc}
34
+ <script src="页面merge.js"></script>
35
+ </body>)
36
+ @html = %Q(<html lang="zh-CN">
37
+ #{@head}
38
+ #{@body}
39
+ </html>)
40
+ end
41
+
42
+ def test_check_right_tag
43
+ tag = parse(@html)
44
+ assert_equal [], @rule.check_html_tag(tag)
45
+ end
46
+
47
+ def test_check_missing_desc
48
+ tag = parse(@head.sub(/<meta name="description".*?\/>/m, ''))
49
+ assert_equal [["新页面按库中的HTML基本结构模板书写基本页面结构", :warn]], @rule.check_html_tag(tag)
50
+ end
51
+
52
+ def test_check_missing_keywords
53
+ tag = parse(@head.sub(/<meta name="keywords".*?\/>/m, ''))
54
+ assert_equal [["新页面按库中的HTML基本结构模板书写基本页面结构", :warn]], @rule.check_html_tag(tag)
55
+ end
56
+
57
+ def test_check_missing_doc
58
+ tag = parse(@body.sub(/<div id="doc"/m, '<div id="_doc"'))
59
+ assert_equal [["新页面按库中的HTML基本结构模板书写基本页面结构", :warn]], @rule.check_html_tag(tag)
60
+ end
61
+
62
+ def test_check_missing_alibar
63
+ tag = parse(@body.sub(/<div id="alibar"/m, '<div id="_alibar"'))
64
+ assert_equal [], @rule.check_html_tag(tag)
65
+
66
+ tag = parse(@doc.sub(/<div id="alibar"/m, '<div id="_alibar"'))
67
+ assert_equal [["新页面按库中的HTML基本结构模板书写基本页面结构", :warn]], @rule.check_html_tag(tag)
68
+ end
69
+
70
+ def test_check_missing_content
71
+ tag = parse(@body.sub(/<div id="content"/m, '<div id="_content"'))
72
+ assert_equal [], @rule.check_html_tag(tag)
73
+
74
+ tag = parse(@doc.sub(/<div id="content"/m, '<div id="_content"'))
75
+ assert_equal [["新页面按库中的HTML基本结构模板书写基本页面结构", :warn]], @rule.check_html_tag(tag)
76
+ end
77
+
78
+ def test_check_missing_footer
79
+ tag = parse(@body.sub(/<div id="footer"/m, '<div id="_footer"'))
80
+ assert_equal [], @rule.check_html_tag(tag)
81
+
82
+ tag = parse(@doc.sub(/<div id="footer"/m, '<div id="_footer"'))
83
+ assert_equal [["新页面按库中的HTML基本结构模板书写基本页面结构", :warn]], @rule.check_html_tag(tag)
84
+ end
85
+
86
+ def test_check_missing_header
87
+ tag = parse(@body.sub(/<div id="header"/m, '<div id="_header"'))
88
+ assert_equal [], @rule.check_html_tag(tag)
89
+
90
+ tag = parse(@doc.sub(/<div id="header"/m, '<div id="_header"'))
91
+ assert_equal [["新页面按库中的HTML基本结构模板书写基本页面结构", :warn]], @rule.check_html_tag(tag)
92
+ end
93
+
94
+ private
95
+ def parse(src)
96
+ XRay::HTML::Parser.parse(src)
97
+ end
98
+
99
+ end
100
+
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../../helper'
4
+ require 'html/rule/check_tag_rule'
5
+
6
+ module XRayTest
7
+ module HTML
8
+ module Rule
9
+
10
+ class CheckHyperlinkWithTargetTest < Test::Unit::TestCase
11
+
12
+ def setup
13
+ @rule = XRay::HTML::Rule::CheckTagRule.new
14
+ end
15
+
16
+ def test_check_functional_a_with_target
17
+ tag = XRay::HTML::Element.new('a', {:href=>'#nogo', :target=>'_self'})
18
+ assert_equal [], @rule.check_html_tag(tag)
19
+ end
20
+
21
+ def test_check_functional_a_without_target
22
+ tag = XRay::HTML::Element.new('a', {:href=>'#nogo'})
23
+ assert_equal [['功能a必须加target="_self",除非preventDefault过', :warn]], @rule.check_html_tag(tag)
24
+ end
25
+
26
+ def test_when_html_has_base_tag
27
+ @rule.check_html_tag XRay::HTML::Element.new('base', {:target=>'_self'})
28
+
29
+ tag = XRay::HTML::Element.new('a', {:href=>'#nogo'})
30
+ assert_equal [], @rule.check_html_tag(tag)
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+
39
+
40
+