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,71 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/checklist'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class NestTryCatchTest < BaseTest
11
+
12
+ def test_ok
13
+ js = '
14
+ try {
15
+
16
+ } catch (e) {
17
+
18
+ }
19
+ '
20
+ ret = visit js
21
+ assert_equal [], ret
22
+ end
23
+
24
+ def test_fail
25
+ js = '
26
+ try {
27
+ if (a > 0) {
28
+ try {
29
+
30
+ } catch (e) {
31
+
32
+ }
33
+ }
34
+ } finally {
35
+
36
+ }
37
+ '
38
+ ret = visit js
39
+ assert_equal [['try catch一般不允许嵌套,若嵌套,需要充分的理由', :warn]], ret
40
+ end
41
+
42
+ def test_nest_in_finnally_part
43
+ js = '
44
+ try {
45
+ if (a > 0) {
46
+ }
47
+ } finally {
48
+ try {
49
+
50
+ } catch (e) {
51
+
52
+ }
53
+ }
54
+ '
55
+ ret = visit js
56
+ assert_equal [['try catch一般不允许嵌套,若嵌套,需要充分的理由', :warn]], ret
57
+ end
58
+
59
+ private
60
+
61
+ def visit(js)
62
+ stat = parse js, 'stat_try'
63
+ rule = XRay::JS::Rule::ChecklistRule.new
64
+ rule.visit_stat_try stat
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/checklist'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class NewObjectAndNewArrayTest < BaseTest
11
+
12
+ def test_default
13
+ js = '
14
+ new Object();
15
+ '
16
+ ret = visit js
17
+ assert_equal [['使用{}代替new Object()', :error]], ret
18
+
19
+ js = '
20
+ new Array();
21
+ '
22
+ ret = visit js
23
+ assert_equal [['使用[]代替new Array()', :error]], ret
24
+ end
25
+
26
+ private
27
+
28
+ def visit(js)
29
+ expr = parse js, 'expr_new'
30
+ rule = XRay::JS::Rule::ChecklistRule.new
31
+ rule.visit_expr_new expr
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/checklist'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class NoEvalTest < BaseTest
11
+
12
+ def test_no_eval
13
+ js = 'eval("a = 1 + 2 + 3")'
14
+ ret = visit js
15
+ assert_equal [['不允许使用eval', :error]], ret
16
+
17
+ js = 'window.eval("1 + 2 + 3")'
18
+ ret = visit js
19
+ assert_equal [['不允许使用eval', :error]], ret
20
+ end
21
+
22
+ private
23
+
24
+ def visit(js)
25
+ expr = parse js, 'expr_member'
26
+ rule = XRay::JS::Rule::ChecklistRule.new
27
+ rule.visit_expr_member expr
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,88 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/no_global'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class NoGlobalTest < BaseTest
11
+
12
+ class Parser < XRay::JS::Parser
13
+ include XRay::ParserVisitable
14
+ end
15
+
16
+ def test_main
17
+ js = '
18
+ var a = 1;
19
+ a++;
20
+ function hello() {
21
+ }
22
+ if (a < 100) {
23
+ var b;
24
+ (function(k) {
25
+ var c = 123;
26
+
27
+ function d(j) {
28
+ a = 1000;
29
+ z = 200;
30
+ k = 300;
31
+ j = 400
32
+ }
33
+ })();
34
+ }
35
+ '
36
+
37
+ ret = parse js
38
+ assert_equal 4, ret.length
39
+ assert_equal '(var,[(var=,a,1)],)', ret[0].node.text
40
+ assert_equal 'hello', ret[1].node.text
41
+ assert_equal '(var,[(var=,b,)],)', ret[2].node.text
42
+ assert_equal '(=,z,200)', ret[3].node.text
43
+ end
44
+
45
+ def test_scope_in_other_function
46
+ js = <<-JS
47
+ /**
48
+ * scope test fixture
49
+ */
50
+ (function($){
51
+ function test(){
52
+ var temp;
53
+ }
54
+
55
+ var _createSeperator = function(){
56
+ var _self = this,
57
+ menuEl = _self.get('menuEl');
58
+ temp = [a,b,c];
59
+ return new Node(temp).appendTo(menuEl);
60
+
61
+ test = 123;
62
+
63
+ //var temp2;
64
+ temp2 = 234;
65
+ };
66
+
67
+ })(jQuery);
68
+ JS
69
+
70
+ ret = parse js
71
+ assert_equal [
72
+ "禁止使用未定义的变量(或全局变量)",
73
+ "禁止使用未定义的变量(或全局变量)"
74
+ ], ret.map(&:message)
75
+ assert_equal '(=,temp,[a,b,c])', ret[0].node.text
76
+ assert_equal '(=,temp2,234)', ret[1].node.text
77
+
78
+ end
79
+
80
+ def parse(js)
81
+ parse_with_rule js, XRay::JS::Rule::NoGlobalRule
82
+ end
83
+
84
+ end
85
+
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/checklist'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class PrivateMethodCheckTest < BaseTest
11
+
12
+ def test_normal
13
+ js = 'a.check("good")'
14
+ ret = visit js
15
+ assert_equal [], ret
16
+ end
17
+
18
+ def test_protected_called
19
+ js = "a._check('good')"
20
+ ret = visit js
21
+ assert_equal 1, ret.length
22
+ end
23
+
24
+ def test_protected_called_via_apply
25
+ js = "a._check.call(a, 'good')"
26
+ ret = visit js
27
+ assert_equal 1, ret.length
28
+ end
29
+
30
+ def test_private_called
31
+ js = "a.__check('good')"
32
+ ret = visit js
33
+ assert_equal 1, ret.length
34
+ end
35
+
36
+ def test_good_case
37
+ js = "this.__check('good')"
38
+ ret = visit js
39
+ assert_equal [], ret
40
+
41
+ js = "self._check('good')"
42
+ ret = visit js
43
+ assert_equal [], ret
44
+ end
45
+
46
+ private
47
+
48
+ def visit(js)
49
+ expr = parse js, 'expr_member'
50
+ rule = XRay::JS::Rule::ChecklistRule.new
51
+ rule.send :visit_expr_member, expr
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/checklist'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class SemicolonTest < BaseTest
11
+ include XRay::JS::Rule
12
+
13
+ def setup
14
+ @msg = '所有语句结束带上分号'
15
+ end
16
+
17
+ def test_block
18
+ js = '{
19
+ i = i++;
20
+ }'
21
+
22
+ ret = visit js, 'block'
23
+ assert_equal [], ret
24
+ end
25
+
26
+ def test_empty
27
+ ret = visit ';', 'empty'
28
+ assert_equal [], ret
29
+ end
30
+
31
+ def test_var
32
+ js = '
33
+ var a = 1, b = 2
34
+ a++;
35
+ '
36
+ ret = visit js, 'var'
37
+ assert_equal [[@msg, :error]], ret
38
+ end
39
+
40
+ def test_expression
41
+ js = '
42
+ a = i + 1 + 2 + 3 * 9
43
+ i++
44
+ '
45
+ ret = visit js, 'expression'
46
+ assert_equal [[@msg, :error]], ret
47
+ end
48
+
49
+ private
50
+
51
+ def visit(js, type)
52
+ stat = parse js, :statement
53
+ assert_equal type, stat.type
54
+
55
+ rule = XRay::JS::Rule::ChecklistRule.new
56
+ rule.visit_statement stat
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,68 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/checklist'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class StatIfWithBraceTest < BaseTest
11
+
12
+ def setup
13
+ @msg = '所有条件区域必须用花括号括起来'
14
+ end
15
+
16
+ def test_ok
17
+ js = '
18
+ if (i == 0) {
19
+ i++;
20
+ } else {
21
+ i--
22
+ }
23
+ '
24
+ ret = visit js
25
+ assert_equal [], ret
26
+ end
27
+
28
+ def test_fail_1
29
+ js = '
30
+ if (i > 0)
31
+ i--
32
+ hello();
33
+ '
34
+ ret = visit js
35
+ assert_equal [[@msg, :error]], ret
36
+ end
37
+
38
+ def test_fail_2
39
+ js = '
40
+ if (hello()) {
41
+ i--;
42
+ } else i++;
43
+
44
+ '
45
+ ret = visit js
46
+ assert_equal [[@msg, :error]], ret
47
+ end
48
+
49
+ def test_fail_3
50
+ js = 'if (i) i--; else i++;'
51
+
52
+ ret = visit js
53
+ assert_equal [[@msg, :error]], ret
54
+ end
55
+
56
+ private
57
+
58
+ def visit(js)
59
+ stat = parse js, 'stat_if'
60
+ rule = XRay::JS::Rule::ChecklistRule.new
61
+ rule.visit_stat_if stat
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,68 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/checklist'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class StatIfWithMutiElseTest < BaseTest
11
+
12
+ def setup
13
+ @msg = '3个条件及以上的条件语句用switch代替if else'
14
+ end
15
+
16
+ def test_ok
17
+ js = '
18
+ if (a > 0) {
19
+
20
+ } else if (a > 10) {
21
+
22
+ } else {
23
+
24
+ }
25
+ '
26
+ ret = visit js
27
+ assert_equal [], ret
28
+ end
29
+
30
+ def test_fail_1
31
+ js = '
32
+ if (a > 1) {
33
+ } else if (a > 20) {
34
+ } else if (a > 30) {
35
+ } else {
36
+ }
37
+ '
38
+ ret = visit js
39
+ assert_equal [[@msg, :error]], ret
40
+ end
41
+
42
+ def test_fail_2
43
+ js = '
44
+ if (a > 2) {
45
+ } else if (a > 40) {
46
+ } else if (a > 50) {
47
+ } else if (a > 60) {
48
+ }
49
+ '
50
+ ret = visit js
51
+ assert_equal [[@msg, :error]], ret
52
+ end
53
+
54
+
55
+
56
+ private
57
+
58
+ def visit(js)
59
+ stat = parse js, 'stat_if'
60
+ rule = XRay::JS::Rule::ChecklistRule.new
61
+ rule.visit_stat_if stat
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+ require_relative 'base_test'
3
+
4
+ require 'js/rule/checklist'
5
+
6
+ module XRayTest
7
+ module JS
8
+ module Rule
9
+
10
+ class UseStrictEqualTest < BaseTest
11
+
12
+ def test_ok
13
+ js = 'i === 1 + 1 / 2'
14
+ ret = visit js
15
+ assert_equal [], ret
16
+
17
+ js = 'i !== hello()'
18
+ ret = visit js
19
+ assert_equal [], ret
20
+ end
21
+
22
+ def test_fail
23
+ js = 'i == 1 + 1 / 2'
24
+ ret = visit js
25
+ assert_equal [['避免使用==和!=操作符', :warn]], ret
26
+
27
+ js = 'i != hello()'
28
+ ret = visit js
29
+ assert_equal [['避免使用==和!=操作符', :warn]], ret
30
+ end
31
+
32
+ private
33
+
34
+ def visit(js)
35
+ expr = parse js, 'expr_equal'
36
+ rule = XRay::JS::Rule::ChecklistRule.new
37
+ rule.visit_expr_equal expr
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,47 @@
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 File.expand_path('../helper', File.dirname(__FILE__))
7
+
8
+ module XRayTest
9
+
10
+ module JS
11
+
12
+ class RuleTest < Test::Unit::TestSuite
13
+
14
+ NAMES = %w(
15
+ semicolon_test
16
+ stat_if_with_brace_test
17
+ stat_if_with_muti_else_test
18
+ no_eval_test
19
+ use_strict_equal_test
20
+ new_object_and_new_array_test
21
+ nest_try_catch_test
22
+ jq_check_test
23
+ no_global_test
24
+ all_test
25
+ file_checker_test
26
+ alert_check_test
27
+ private_method_check_test
28
+ )
29
+
30
+ def self.suite
31
+ tests = Test::Unit::TestSuite.new
32
+ NAMES.each do |name|
33
+ require_relative "rule/#{name}"
34
+
35
+ name = name.gsub(/_(\w)/) { |m| m[1].chr.upcase }
36
+ name = name[0].chr.upcase + name[1..-1]
37
+
38
+ tests << Rule.const_get(name).suite
39
+ end
40
+ tests
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ Test::Unit::UI::Console::TestRunner.run(XRayTest::JS::RuleTest) if __FILE__ == $0
47
+
@@ -0,0 +1,26 @@
1
+ module XRayTest
2
+ module JS
3
+ module Stat
4
+
5
+ module If
6
+ def test_parse_stat_if
7
+ js = '
8
+ if (a === b && c === d) {
9
+ hello("alibaba");
10
+ } else {
11
+ other("taobao");
12
+ }
13
+ '
14
+
15
+ stat = parse_js :parse_stat_if, js
16
+
17
+ assert_equal 'if', stat.type
18
+ assert_equal '(&&,(===,a,b),(===,c,d))', stat.condition.text
19
+ assert_equal '(block,[(expression,((,hello,["alibaba"]),)],)', stat.true_part.text
20
+ assert_equal '(block,[(expression,((,other,["taobao"]),)],)', stat.false_part.text
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end