Skip to content

Commit 169e852

Browse files
committed
Merge pull request #17 from twada/es6
ES6 support
2 parents 0249c63 + 605efda commit 169e852

File tree

8 files changed

+160
-79
lines changed

8 files changed

+160
-79
lines changed

.travis.yml

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ before_install:
99
- "npm install -g browserify"
1010
- "npm install -g dereserve"
1111
- "npm install -g derequire"
12-
- "npm install -g espower-cli"
1312
- "npm install -g mocha"
1413
- "npm install -g mocha-phantomjs"
1514
before_script:

README.md

+15-4
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ What is `power-assert`?
2525
* works both on server side and browser side.
2626
* available via [npm](https://www.npmjs.com/package/power-assert) and [bower](http://bower.io/search/?q=power-assert).
2727
* supports sourcemaps so you can debug as usual.
28+
* Now supports ES6 through [babel plugin](https://github.com/twada/babel-plugin-espower).
2829
* provides [browserify transform](http://github.com/twada/espowerify).
2930
* provides [webpack loader](https://github.com/zoncoen/webpack-espower-loader).
3031
* provides [grunt task](http://github.com/twada/grunt-espower) and [gulp plugin](http://github.com/twada/gulp-espower).
3132
* provides [command](http://github.com/twada/espower-cli).
3233
* provides [custom module loader](http://github.com/twada/espower-loader) and its [convenient config module](https://github.com/azu/intelli-espower-loader).
3334
* provides [karma preprocessor](https://github.com/vvakame/karma-espower-preprocessor).
34-
* supports ES6 through [Traceur Compiler](https://github.com/yosuke-furukawa/espower-traceur) or [Babel](https://github.com/azu/espower-babel).
35+
* supports ES6 through [babel plugin](https://github.com/twada/babel-plugin-espower), [module loader for Traceur Compiler](https://github.com/yosuke-furukawa/espower-traceur), and [module loader for Babel](https://github.com/azu/espower-babel).
3536
* supports [CoffeeScript](http://github.com/twada/espower-coffee).
3637
* has [TypeScript type definition](https://github.com/borisyankov/DefinitelyTyped/blob/master/power-assert/power-assert.d.ts)
3738
* is a beta version product. Pull-requests, issue reports and patches are always welcomed.
@@ -155,6 +156,7 @@ Code transform is done by instrumentors below:
155156
- [espower-coffee](http://github.com/twada/espower-coffee)
156157
- [espower-traceur](https://github.com/yosuke-furukawa/espower-traceur)
157158
- [espower-babel](https://github.com/azu/espower-babel)
159+
- [babel-plugin-espower](https://github.com/twada/babel-plugin-espower)
158160

159161
If you are using Node.js only, the easiest way is to use [intelli-espower-loader](https://github.com/azu/intelli-espower-loader). Steps are as follows.
160162

@@ -260,9 +262,10 @@ HOW TO USE
260262
There are four ways to use power-assert. (If you want to see running examples, see [SEED PROJECTS](#seed-projects))
261263

262264
1. `power-assert` + `espower-loader`: Highly recommended but only works under Node.
263-
2. `power-assert` + `espower-coffee` or `espower-traceur` or `espower-babel` : Use power-assert through transpilers. Recommended but only works under Node.
264-
3. `power-assert` + `espowerify` or `webpack-espower-loader`: Recommended if you are using [browserify](http://browserify.org/) or [webpack](http://webpack.github.io/).
265-
4. `power-assert` + `espower-cli` or `grunt-espower` or `gulp-espower` : Generate instrumented code so works anywhere.
265+
2. `power-assert` + `Babel` + `babel-plugin-espower`: Recommended if you are writing ES6 with [Babel](https://babeljs.io/)
266+
3. `power-assert` + `espower-coffee` or `espower-traceur` or `espower-babel` : Use power-assert through transpilers. Recommended but only works under Node.
267+
4. `power-assert` + `espowerify` or `webpack-espower-loader`: Recommended if you are using [browserify](http://browserify.org/) or [webpack](http://webpack.github.io/).
268+
5. `power-assert` + `espower-cli` or `grunt-espower` or `gulp-espower` : Generate instrumented code so works anywhere.
266269

267270

268271
### using `espower-loader`
@@ -308,6 +311,13 @@ If you are writing Node.js app/module in CoffeeScript, you can instrument Power
308311
see [espower-coffee README](https://github.com/twada/espower-coffee).
309312

310313

314+
### using `babel-plugin-espower`
315+
316+
If you are writing your code in ES6, you can instrument Power Assert feature with Babel and babel-plugin-espower.
317+
318+
see [babel-plugin-espower README](https://github.com/twada/babel-plugin-espower).
319+
320+
311321
### using `espower-traceur` or `espower-babel`
312322

313323
If you are writing Node.js app/module in ES6, you can instrument Power Assert feature without code generation by using `espower-traceur` or `espower-babel`. `espower-traceur` uses [Traceur Compiler](https://github.com/google/traceur-compiler/), `espower-babel` uses [Babel](https://babeljs.io/).
@@ -543,6 +553,7 @@ and instrumentors are,
543553
| [espower-cli](http://github.com/twada/espower-cli) | Command line tool for power-assert. |
544554
| [espower-loader](http://github.com/twada/espower-loader) | Node module loader to apply `espower` on the fly. |
545555
| [intelli-espower-loader](https://github.com/azu/intelli-espower-loader) | configure `espower-loader` with ease. |
556+
| [babel-plugin-espower](https://github.com/twada/babel-plugin-espower) | [Babel](https://babeljs.io/) plugin to instrument power-assert feature into target files. |
546557
| [espowerify](http://github.com/twada/espowerify) | [Browserify](http://browserify.org/) transform to apply `espower` to target files. |
547558
| [webpack-espower-loader](https://github.com/zoncoen/webpack-espower-loader) | Power Assert instrumentor module for [webpack](http://webpack.github.io/). |
548559
| [grunt-espower](http://github.com/twada/grunt-espower) | Grunt task to apply `espower` to target files. |

bower.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
},
4141
"devDependencies": {
4242
"expect": "~0.3.1",
43-
"mocha": "~2.1.0",
44-
"requirejs": "~2.1.15"
43+
"mocha": "~2.2.4",
44+
"requirejs": "~2.1.17"
4545
}
4646
}

enable_power_assert.js

+4-15
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
1-
require('espower-loader')({
2-
cwd: process.cwd(),
3-
pattern: 'test/tobe_instrumented/*_test.js',
4-
espowerOptions: {
5-
patterns: [
6-
'assert(value, [message])',
7-
'assert.ok(value, [message])',
8-
'assert.equal(actual, expected, [message])',
9-
'assert.notEqual(actual, expected, [message])',
10-
'assert.strictEqual(actual, expected, [message])',
11-
'assert.notStrictEqual(actual, expected, [message])',
12-
'assert.deepEqual(actual, expected, [message])',
13-
'assert.notDeepEqual(actual, expected, [message])'
14-
]
15-
}
1+
require("babel/register")({
2+
only: /test\/tobe_instrumented/,
3+
plugins: ['babel-plugin-espower'],
4+
extensions: ['.es6', '.js']
165
});

package.json

+9-7
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@
2121
}
2222
],
2323
"dependencies": {
24-
"empower": "~0.10.0",
25-
"power-assert-formatter": "~0.10.2",
26-
"xtend": "~4.0.0"
24+
"empower": "^0.11.0",
25+
"power-assert-formatter": "^0.11.0",
26+
"xtend": "^4.0.0"
2727
},
2828
"devDependencies": {
29-
"espower-loader": "~0.10.0",
30-
"expect.js": "~0.3.1",
31-
"qunit-tap": "~1.5.0",
29+
"babel": "^5.1.10",
30+
"babel-core": "^5.1.10",
31+
"babel-plugin-espower": "^0.1.0",
32+
"expect.js": "^0.3.1",
33+
"qunit-tap": "^1.5.0",
3234
"qunitjs": "1.14.0"
3335
},
3436
"files": [
@@ -64,7 +66,7 @@
6466
"build": "npm prune && npm dedupe && browserify --standalone assert ./index.js | dereserve | derequire > build/power-assert.js",
6567
"clean": "rm -rf ./espowered_tests && rm -rf ./build",
6668
"setup-dir": "mkdir -p ./build && mkdir -p ./espowered_tests/tobe_instrumented && cp -r test/not_tobe_instrumented/ ./espowered_tests/not_tobe_instrumented/",
67-
"setup-espower": "for i in $(find ./test/tobe_instrumented -name '*_test.js'); do espower $i > ./espowered_tests/tobe_instrumented/$(basename $i); done",
69+
"setup-espower": "for i in $(find ./test/tobe_instrumented -name '*_test.js'); do babel --plugins babel-plugin-espower --blacklist strict $i > ./espowered_tests/tobe_instrumented/$(basename $i); done",
6870
"setup": "npm run clean && npm run setup-dir && npm run setup-espower && npm run build",
6971
"test-unit": "mocha --reporter dot --require ./enable_power_assert.js ./test/**/*_test.js",
7072
"test-generated": "mocha --reporter dot ./espowered_tests/**/*_test.js",

test/tobe_instrumented/es6_test.js

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
(function (root, factory) {
2+
'use strict';
3+
4+
if (typeof define === 'function' && define.amd) {
5+
define(['power-assert', 'expect'], factory);
6+
} else if (typeof exports === 'object') {
7+
factory(require('../..'), require('expect.js'));
8+
} else {
9+
factory(root.assert, root.expect);
10+
}
11+
}(this, (assert, expect) => {
12+
13+
function expectPowerAssertMessage (body, expectedLines) {
14+
try {
15+
body();
16+
expect().fail("AssertionError should be thrown");
17+
} catch (e) {
18+
expect(e.message.split('\n').slice(2, -1)).to.eql(expectedLines.map(function (line) {
19+
return line;
20+
}));
21+
}
22+
}
23+
24+
describe('ES6 features', () => {
25+
26+
it('Destructuring and TemplateLiteral', () => {
27+
let [alice, bob] = [ { name: 'alice' }, { name: 'bob' } ];
28+
expectPowerAssertMessage (() => {
29+
assert(`${alice.name} and ${bob.name}` === `bob and alice`);
30+
}, [
31+
' assert(`${ alice.name } and ${ bob.name }` === `bob and alice`)',
32+
' | | | | | | | ',
33+
' | | | | | | "bob and alice" ',
34+
' | | | | "bob" false ',
35+
' | | "alice" Object{name:"bob"} ',
36+
' | Object{name:"alice"} ',
37+
' "alice and bob" ',
38+
' ',
39+
' --- [string] `bob and alice`',
40+
' +++ [string] `${ alice.name } and ${ bob.name }`',
41+
' @@ -1,13 +1,13 @@',
42+
' -bob and alice',
43+
' +alice and bob',
44+
' '
45+
]);
46+
});
47+
48+
it('ArrowFunctionExpression and SpreadElement', () => {
49+
let seven = 7, ary = [4, 5];
50+
expectPowerAssertMessage (() => {
51+
assert(seven === ((v, i) => v + i)(...[...ary]));
52+
}, [
53+
' assert(seven === ((v, i) => v + i)(...[...ary]))',
54+
' | | | | | ',
55+
' | | | | [4,5] ',
56+
' | | 9 [4,5] ',
57+
' 7 false ',
58+
' ',
59+
' [number] ((v, i) => v + i)(...[...ary])',
60+
' => 9',
61+
' [number] seven',
62+
' => 7'
63+
]);
64+
});
65+
66+
it('Enhanced Object Literals', () => {
67+
let name = 'bobby';
68+
expectPowerAssertMessage (() => {
69+
assert.deepEqual({
70+
name,
71+
[`${ name } greet`]: `Hello, I am ${ name }`
72+
}, null);
73+
}, [
74+
' assert.deepEqual({name,[`${ name } greet`]: `Hello, I am ${ name }`}, null)',
75+
' | | | | | ',
76+
' | | | | "bobby" ',
77+
' | | "bobby" "Hello, I am bobby" ',
78+
' | "bobby greet" ',
79+
' Object{name:"bobby","bobby greet":"Hello, I am bobby"} '
80+
]);
81+
});
82+
});
83+
84+
}));

test/tobe_instrumented/power_assert_test.js

+34-40
Original file line numberDiff line numberDiff line change
@@ -101,22 +101,6 @@ describe('power-assert message', function () {
101101
});
102102

103103

104-
it('assert((delete nonexistent) === false);', function () {
105-
this.expectPowerAssertMessage(function () {
106-
assert((delete nonexistent) === false);
107-
}, [
108-
' assert(delete nonexistent === false)',
109-
' | | ',
110-
' true false ',
111-
' ',
112-
' [boolean] false',
113-
' => false',
114-
' [boolean] delete nonexistent',
115-
' => true'
116-
]);
117-
});
118-
119-
120104
it('assert((delete foo.bar) === falsy);', function () {
121105
var falsy = 0,
122106
foo = {
@@ -624,11 +608,12 @@ describe('power-assert message', function () {
624608
assert([foo, bar].length === four);
625609
}, [
626610
' assert([foo,bar].length === four)',
627-
' | | | | | ',
628-
' | | | | 4 ',
629-
' | | 2 false ',
630-
' | "fuga" ',
631-
' "hoge" ',
611+
' || | | | | ',
612+
' || | | | 4 ',
613+
' || | 2 false ',
614+
' || "fuga" ',
615+
' |"hoge" ',
616+
' ["hoge","fuga"] ',
632617
' ',
633618
' [number] four',
634619
' => 4',
@@ -645,12 +630,15 @@ describe('power-assert message', function () {
645630
assert(typeof [[foo.bar, baz(moo)], + fourStr] === "number");
646631
}, [
647632
' assert(typeof [[foo.bar,baz(moo)],+fourStr] === "number")',
648-
' | | | | | || | ',
649-
' | | | | | |"4" false ',
650-
' | | | | "boo" 4 ',
651-
' | | | null ',
652-
' | | "fuga" ',
653-
' "object" Object{bar:"fuga"} ',
633+
' | ||| | | | || | ',
634+
' | ||| | | | |"4" false ',
635+
' | ||| | | "boo" 4 ',
636+
' | ||| | null ',
637+
' | ||| "fuga" ',
638+
' | ||Object{bar:"fuga"} ',
639+
' | |["fuga",null] ',
640+
' | [#Array#,4] ',
641+
' "object" ',
654642
' ',
655643
' --- [string] "number"',
656644
' +++ [string] typeof [[foo.bar,baz(moo)],+fourStr]',
@@ -717,9 +705,13 @@ describe('power-assert message', function () {
717705
assert(!({ foo: bar.baz, name: nameOf({firstName: first, lastName: last}) }));
718706
}, [
719707
' assert(!{foo: bar.baz,name: nameOf({firstName: first,lastName: last})})',
720-
' | | | | | | ',
721-
' | | "BAZ" "Brendan Eich" "Brendan" "Eich" ',
722-
' false Object{baz:"BAZ"} '
708+
' || | | | | | | ',
709+
' || | | | | "Brendan" "Eich" ',
710+
' || | | | Object{firstName:"Brendan",lastName:"Eich"}',
711+
' || | "BAZ" "Brendan Eich" ',
712+
' || Object{baz:"BAZ"} ',
713+
' |Object{foo:"BAZ",name:"Brendan Eich"} ',
714+
' false ',
723715
]);
724716
});
725717

@@ -849,8 +841,9 @@ describe('power-assert message', function () {
849841
assert.deepEqual(alice || bob, {name: kenName, age: four});
850842
},[
851843
' assert.deepEqual(alice || bob, {name: kenName,age: four})',
852-
' | | | | ',
853-
' | | "ken" 4 ',
844+
' | | | | | ',
845+
' | | | "ken" 4 ',
846+
' | | Object{name:"ken",age:4} ',
854847
' | Person{name:"alice",age:3} ',
855848
' Person{name:"alice",age:3} '
856849
]);
@@ -863,14 +856,15 @@ describe('power-assert message', function () {
863856
assert.notDeepEqual([foo, bar, baz], new Array(foo, bar, baz));
864857
},[
865858
' assert.notDeepEqual([foo,bar,baz], new Array(foo, bar, baz))',
866-
' | | | | | | | ',
867-
' | | | | | | Object{name:"hoge"}',
868-
' | | | | | ["toto","tata"]',
869-
' | | | | "foo" ',
870-
' | | | ["foo",#Array#,#Object#] ',
871-
' | | Object{name:"hoge"} ',
872-
' | ["toto","tata"] ',
873-
' "foo" '
859+
' || | | | | | | ',
860+
' || | | | | | Object{name:"hoge"}',
861+
' || | | | | ["toto","tata"]',
862+
' || | | | "foo" ',
863+
' || | | ["foo",#Array#,#Object#] ',
864+
' || | Object{name:"hoge"} ',
865+
' || ["toto","tata"] ',
866+
' |"foo" ',
867+
' ["foo",#Array#,#Object#] '
874868
]);
875869
});
876870

0 commit comments

Comments
 (0)