jshint4r 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe JSHint4r::Reporter::Compilation do
4
+ before(:all) {
5
+ @reporter = JSHint4r.reporter( :compilation )
6
+ }
7
+
8
+ describe 'report' do
9
+ context 'ordinary errors' do
10
+ subject {
11
+ target, errors = sample_error
12
+ @reporter.report( target, errors )
13
+ }
14
+ it {
15
+ should eq(<<EOD)
16
+ jshint.js:4019:32: Missing semicolon.
17
+ itself.edition = '2011-04-16'
18
+ jshint.js:4026:28: Missing semicolon.
19
+ exports.JSHINT = JSHINT
20
+ EOD
21
+ }
22
+ end
23
+ context 'no errors' do
24
+ subject {
25
+ @reporter.report( 'jshint.js', nil )
26
+ }
27
+ it {
28
+ should be_nil
29
+ }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe JSHint4r::Reporter::Text do
4
+ before(:all) {
5
+ @reporter = JSHint4r.reporter( :text )
6
+ }
7
+
8
+ describe 'report' do
9
+ context 'ordinary errors' do
10
+ subject {
11
+ target, errors = sample_error
12
+ @reporter.report( target, errors )
13
+ }
14
+ it {
15
+ should eq(<<EOD)
16
+ jshint.js: line 4019, col 32, Missing semicolon.
17
+ jshint.js: line 4026, col 28, Missing semicolon.
18
+
19
+ 2 errors
20
+ EOD
21
+ }
22
+ end
23
+ describe 'no errors' do
24
+ context 'verbose' do
25
+ subject {
26
+ @reporter.report( 'jshint.js', nil, true )
27
+ }
28
+ it {
29
+ should eq(<<EOD)
30
+ jshint.js ... ok
31
+ EOD
32
+ }
33
+ end
34
+ context 'silent' do
35
+ subject {
36
+ @reporter.report( 'jshint.js', nil )
37
+ }
38
+ it {
39
+ should be_nil
40
+ }
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ class JSHint4r::TestingReporter
4
+ include JSHint4r::Reporter
5
+ end
6
+
7
+ describe JSHint4r::Reporter do
8
+ describe 'reporter' do
9
+ context 'no args' do
10
+ subject {
11
+ JSHint4r.reporter
12
+ }
13
+ it {
14
+ subject.class.should be(JSHint4r::Reporter::Text)
15
+ }
16
+ end
17
+ context :text do
18
+ subject {
19
+ JSHint4r.reporter( :text )
20
+ }
21
+ it {
22
+ subject.class.should be(JSHint4r::Reporter::Text)
23
+ }
24
+ end
25
+ context :compilation do
26
+ subject {
27
+ JSHint4r.reporter( :compilation )
28
+ }
29
+ it {
30
+ subject.class.should be(JSHint4r::Reporter::Compilation)
31
+ }
32
+ end
33
+ end
34
+
35
+ describe 'symbolize' do
36
+ subject {
37
+ JSHint4r::TestingReporter.new
38
+ }
39
+ it {
40
+ subject.key_symbolize( 'abc' => 123 ).should eq( :abc => 123 )
41
+ }
42
+ end
43
+ end
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+
3
+ describe JSHint4r::Result do
4
+ def __DATA__
5
+ File.read(__FILE__).sub(/.*\n__END__\n(.*)$/m, '\1')
6
+ end
7
+
8
+ before(:all) {
9
+ @errors = JSHint4r::Result.new( 'target.js', __DATA__ )
10
+ }
11
+
12
+ describe 'target' do
13
+ subject {
14
+ @errors.target
15
+ }
16
+ it {
17
+ should == 'target.js'
18
+ }
19
+ end
20
+
21
+ describe 'errors' do
22
+ subject {
23
+ @errors.errors
24
+ }
25
+ it {
26
+ subject.class.should be(Array)
27
+ }
28
+ it {
29
+ subject.size.should == 2
30
+ }
31
+ end
32
+
33
+ describe 'parse' do
34
+ context 'simple key-value' do
35
+ subject {
36
+ @errors.parse( "{ abc: 'def' }" )
37
+ }
38
+ it {
39
+ should eq( { 'abc' => 'def' } )
40
+ }
41
+ end
42
+ context 'value is bare word' do
43
+ subject {
44
+ @errors.parse( "{ abc: def }" )
45
+ }
46
+ it {
47
+ expect{subject}.should raise_error(ExecJS::ProgramError)
48
+ }
49
+ end
50
+ context "'[]'" do
51
+ subject {
52
+ @errors.parse( '[]' )
53
+ }
54
+ it {
55
+ should eq([])
56
+ }
57
+ end
58
+ context 'empty array' do
59
+ subject {
60
+ @errors.parse( [] )
61
+ }
62
+ it {
63
+ expect{should}.to raise_error(TypeError)
64
+ }
65
+ end
66
+ context 'empty string' do
67
+ subject {
68
+ @errors.parse( '' )
69
+ }
70
+ it {
71
+ should be_nil
72
+ }
73
+ end
74
+ context 'nil' do
75
+ subject {
76
+ @errors.parse( nil )
77
+ }
78
+ it {
79
+ should be_nil
80
+ }
81
+ end
82
+ context 'abc' do
83
+ subject {
84
+ @errors.parse( 'abc' )
85
+ }
86
+ it {
87
+ expect{subject}.to raise_error(ExecJS::ProgramError)
88
+ }
89
+ end
90
+ context 'var abc' do
91
+ subject {
92
+ @errors.parse( 'var abc' )
93
+ }
94
+ it {
95
+ expect{should}.to raise_error(ExecJS::ProgramError)
96
+ }
97
+ end
98
+ end
99
+ end
100
+
101
+ __END__
102
+ [ { id: '(error)',
103
+ raw: 'Missing semicolon.',
104
+ evidence: ' itself.edition = \'2011-04-16\'',
105
+ line: 4019,
106
+ character: 32,
107
+ a: undefined,
108
+ b: undefined,
109
+ c: undefined,
110
+ d: undefined,
111
+ reason: 'Missing semicolon.' },
112
+ { id: '(error)',
113
+ raw: 'Missing semicolon.',
114
+ evidence: ' exports.JSHINT = JSHINT',
115
+ line: 4026,
116
+ character: 28,
117
+ a: undefined,
118
+ b: undefined,
119
+ c: undefined,
120
+ d: undefined,
121
+ reason: 'Missing semicolon.' } ]
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe JSHint4r::Source do
4
+ describe 'src' do
5
+ describe 'include jshint.js' do
6
+ it {
7
+ JSHint4r::Source.src.should be_include('JSHINT')
8
+ }
9
+ end
10
+ describe 'include jshint_runner.js' do
11
+ it {
12
+ JSHint4r::Source.src.should be_include('JSHINT.run')
13
+ }
14
+ end
15
+ end
16
+
17
+ describe 'context' do
18
+ before(:all) {
19
+ @subject = JSHint4r::Source.context
20
+ }
21
+ context 'ExecJS::*::Context object' do
22
+ it {
23
+ @subject.should be_respond_to(:exec)
24
+ }
25
+ it {
26
+ @subject.should be_respond_to(:eval)
27
+ }
28
+ it {
29
+ @subject.should be_respond_to(:call)
30
+ }
31
+ end
32
+ context 'singleton' do
33
+ it {
34
+ JSHint4r::Source.context.object_id.should be(@subject.object_id)
35
+ }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,134 @@
1
+ require 'spec_helper'
2
+
3
+ describe JSHint4r::Target do
4
+ before(:all) {
5
+ config = JSHint4r::Config.new( fixture( 'config.yml' ) )
6
+ @target = JSHint4r::Target.new( config.targets, config.excludes )
7
+ }
8
+
9
+ describe 'initialize' do
10
+ context 'nil' do
11
+ subject {
12
+ JSHint4r::Target.new nil, nil
13
+ }
14
+ it {
15
+ subject.targets.should eq([])
16
+ }
17
+ it {
18
+ subject.excludes.should eq([])
19
+ }
20
+ end
21
+ context 'no args' do
22
+ subject {
23
+ JSHint4r::Target.new
24
+ }
25
+ it {
26
+ lambda {subject}.should raise_error( ArgumentError )
27
+ }
28
+ it {
29
+ lambda {subject}.should_not raise_error( TypeError )
30
+ }
31
+ end
32
+ end
33
+
34
+ describe 'targets' do
35
+ describe 'Array' do
36
+ subject {
37
+ @target.targets.class
38
+ }
39
+ it {
40
+ should eq(Array)
41
+ }
42
+ end
43
+ describe 'size' do
44
+ subject {
45
+ @target.targets.size
46
+ }
47
+ it {
48
+ should > 0
49
+ }
50
+ end
51
+ end
52
+
53
+ describe 'excludes' do
54
+ describe 'Array' do
55
+ subject {
56
+ @target.excludes.class
57
+ }
58
+ it {
59
+ should eq(Array)
60
+ }
61
+ end
62
+ describe 'size' do
63
+ subject {
64
+ @target.excludes.size
65
+ }
66
+ it {
67
+ should > 0
68
+ }
69
+ end
70
+ end
71
+
72
+ describe 'each' do
73
+ describe 'list' do
74
+ subject {
75
+ side = []
76
+ @target.each { |e|
77
+ side << e
78
+ }
79
+
80
+ side
81
+ }
82
+ it {
83
+ should eq(['spec/fixtures/missing_semicolon.js'])
84
+ }
85
+ end
86
+ describe 'exist' do
87
+ subject {
88
+ side = []
89
+
90
+ @target.each { |e|
91
+ side << File.exist?( e )
92
+ }
93
+
94
+ side
95
+ }
96
+ it {
97
+ should eq([true])
98
+ }
99
+ end
100
+ end
101
+
102
+ describe 'real_targets' do
103
+ before(:all) {
104
+ @t = @target.real_targets
105
+ }
106
+ describe 'no_errors.js' do
107
+ subject {
108
+ @t.grep( /no_errors\.js/ )
109
+ }
110
+ it {
111
+ should eq([])
112
+ }
113
+ end
114
+ describe 'directory not exist' do
115
+ subject {
116
+ @t.find { |e| File.directory? e }
117
+ }
118
+ it {
119
+ should be_nil
120
+ }
121
+ end
122
+ describe 'file exists' do
123
+ subject {
124
+ @t.find_all { |e| File.file? e }
125
+ }
126
+ it {
127
+ subject.class.should eq(Rake::FileList)
128
+ }
129
+ it {
130
+ subject.size.should > 0
131
+ }
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe JSHint4r do
4
+ pending
5
+ it "fails" do
6
+ puts "hey buddy, you should probably rename this file and start specing for real"
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'jshint4r'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
13
+
14
+ def fixture( name )
15
+ File.join( File.dirname(__FILE__), 'fixtures', name )
16
+ end
@@ -0,0 +1,22 @@
1
+ def sample_error
2
+ [ 'jshint.js',
3
+ [
4
+ {
5
+ 'id' => '(error)',
6
+ 'raw' => 'Missing semicolon.',
7
+ 'evidence' => ' itself.edition = \'2011-04-16\'',
8
+ 'line' => 4019,
9
+ 'character' => 32,
10
+ 'reason' => 'Missing semicolon.'
11
+ },
12
+ {
13
+ 'id' => '(error)',
14
+ 'raw' => 'Missing semicolon.',
15
+ 'evidence' => ' exports.JSHINT = JSHINT',
16
+ 'line' => 4026,
17
+ 'character' => 28,
18
+ 'reason' => 'Missing semicolon.'
19
+ }
20
+ ]
21
+ ]
22
+ end
@@ -0,0 +1,63 @@
1
+ April 16, 2011
2
+ * New edition: 2011-04-16
3
+
4
+ * Unit tests for all options and some core functions
5
+ * A number of small typo and message fixes
6
+ * JSHint is now a JavaScript/JSON parser only
7
+ (ADSafe, HTML, CSS related code was removed)
8
+ * JSHint now supports function-scoped options
9
+ * JSHint now supports both /*jshint and /*jslint
10
+
11
+ * JSHint now supports shebangs (#!)
12
+ * Added support for typed array globals
13
+ * Allowed the use of variables/functions before definition.
14
+ (option 'latedef' to disallow)
15
+ * Fixed a bug with 'forin' option
16
+ * Fixed Rhino wrapper's CLI options support
17
+ * Fixed a bug with JSHint leaking internal variables
18
+ * Added option 'expr' to allow ExpressionStatement as valid Program
19
+ * Added an option 'prototypejs' to pre-define Prototype globals
20
+ * Added XPathResult et al. to the 'browser' option
21
+ * Added support for 'undefined' as a function parameter
22
+ * Option 'boss' has now precedence over 'eqeqeq' when it comes to '== null'
23
+ * Fixed a bug with JSHint parsing getters/setters as function statements
24
+ * Added an option 'mootools' to pre-define MooTools globals
25
+ * Added an option 'globalstrict' to allow the use of global strict mode
26
+ * Added HTMLElement to the browser environment
27
+ * Added support for the void operator
28
+ * Fixed a bug with 'new Array'
29
+ * Added option 'white' to check for trailing whitespaces
30
+
31
+ March 01, 2011
32
+ * New edition: 2011-03-02
33
+
34
+ * When library is used from Rhino, you can provide options via command line arguments
35
+
36
+ * Added new HTML5 globals to the 'browser' option
37
+ * Tolerate == null when boss:true
38
+ * Tolerate undefined variables in the typeof and delete
39
+ * Tolerate undefined as a formal parameter
40
+ * Recognize new Array(<expr>) as a valid expression
41
+ * Added support for explicit case statement fallthroughs (using special comments)
42
+ * Added third formal parameter to JSHINT for specifying pre-defined globals
43
+
44
+ * New option 'asi' to tolerate the use of automatic semicolon insertion
45
+ * New option 'jquery' to assume jQuery environment
46
+ * New option 'couch' to assume CouchDB environment
47
+
48
+ February 19, 2011
49
+ * New edition: 2011-02-19
50
+
51
+ * Library can act as a Node.js module and a Rhino program
52
+
53
+ * Tolerate single statements in if/for/while constructions ('curly' to disallow)
54
+ * Tolerate arguments.callee and arguments.caller ('noarg' to disallow)
55
+ * Tolerate empty blocks ('noempty' to disallow)
56
+ * Tolerate the use of `new` for side-effects ('nonew' to disallow)
57
+ * Less strict styling check by default ('white' to revert)
58
+
59
+ * New option 'boss' to tolerate assignments inside if/for/while
60
+ * New option 'node' to assume Node environment
61
+
62
+ January 19, 2011
63
+ * Forked JSLint from the edition 2010-12-16
@@ -0,0 +1,70 @@
1
+ JSHint, The (Gentler) JavaScript Code Quality Tool
2
+ ==================================================
3
+
4
+ JSHint is a fork of Douglas Crockford's [JSLint](http://jslint.com/) that does
5
+ not tyrannize your code. It is designed to detect errors that actually break your
6
+ code while skipping things that, according to Crockford, “are known to
7
+ contribute mistakes in projects”. In other words, JSHint is a fork of JSLint
8
+ for the real world.
9
+
10
+ For example, JSLint does not tolerate the following constructions:
11
+
12
+ if (cond) statement();
13
+
14
+ It expects all blocks to be enclosed in braces ({}):
15
+
16
+ if (cond) {
17
+ statement();
18
+ }
19
+
20
+ JSHint removes that requirement (but it is still available as an option).
21
+
22
+
23
+ Community
24
+ ---------
25
+
26
+ The most important part is that JSHint is developed and supported by
27
+ the JavaScript developers community and not by one very opinionated person.
28
+
29
+ If you use JSLint and think that it is too strict, use
30
+ [Issues](https://github.com/jshint/jshint/issues) to describe most annoying
31
+ JSLint gripes you encounter.
32
+
33
+
34
+ Development
35
+ -----------
36
+
37
+ JSHint was forked from the JSLint, edition 2010-12-16.
38
+ The current stable edition is [2011-02-19](http://jshint.com/jshint.js).
39
+
40
+
41
+ Environments
42
+ ------------
43
+
44
+ JSHint can be used as a Node module out of the box:
45
+
46
+ var JSHINT = require("jshint.js").JSHINT;
47
+
48
+ If you use Rhino, we have a special wrapper script for that:
49
+
50
+ java -jar /path/to/js.jar env/rhino.js myscript.js
51
+
52
+ Also included is a Windows Scripting Host wrapper:
53
+
54
+ cscript env/wsh.js myscript.js
55
+
56
+ And if you're on OS X, use Apple's built-in JavaScriptCore:
57
+
58
+ env/jsc.sh myscript.js
59
+
60
+ Tests
61
+ -----
62
+
63
+ To run tests you will need to install [node.js](http://nodejs.org/) and
64
+ expresso. You can install the latter with npm:
65
+
66
+ npm install expresso
67
+
68
+ After that, running tests is as easy as:
69
+
70
+ expresso tests/*.js