casperjs 1.0.0.RC1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. data/CHANGELOG.md +179 -0
  2. data/LICENSE.md +19 -0
  3. data/README.md +30 -0
  4. data/bin/bootstrap.js +292 -0
  5. data/bin/usage.txt +10 -0
  6. data/casperjs.gemspec +21 -0
  7. data/modules/casper.js +1679 -0
  8. data/modules/cli.js +138 -0
  9. data/modules/clientutils.js +595 -0
  10. data/modules/colorizer.js +129 -0
  11. data/modules/events.js +247 -0
  12. data/modules/injector.js +93 -0
  13. data/modules/mouse.js +110 -0
  14. data/modules/querystring.js +187 -0
  15. data/modules/tester.js +807 -0
  16. data/modules/utils.js +429 -0
  17. data/modules/vendors/coffee-script.js +8 -0
  18. data/modules/xunit.js +123 -0
  19. data/package.json +35 -0
  20. data/rubybin/casperjs +57 -0
  21. data/samples/bbcshots.coffee +64 -0
  22. data/samples/bbcshots.js +80 -0
  23. data/samples/cliplay.coffee +19 -0
  24. data/samples/cliplay.js +21 -0
  25. data/samples/customevents.coffee +11 -0
  26. data/samples/customevents.js +13 -0
  27. data/samples/customlogging.coffee +33 -0
  28. data/samples/customlogging.js +42 -0
  29. data/samples/download.coffee +10 -0
  30. data/samples/download.js +11 -0
  31. data/samples/dynamic.coffee +60 -0
  32. data/samples/dynamic.js +65 -0
  33. data/samples/each.coffee +14 -0
  34. data/samples/each.js +17 -0
  35. data/samples/events.coffee +34 -0
  36. data/samples/events.js +41 -0
  37. data/samples/extends.coffee +29 -0
  38. data/samples/extends.js +37 -0
  39. data/samples/googlelinks.coffee +27 -0
  40. data/samples/googlelinks.js +33 -0
  41. data/samples/googlematch.coffee +47 -0
  42. data/samples/googlematch.js +65 -0
  43. data/samples/googlepagination.coffee +40 -0
  44. data/samples/googlepagination.js +51 -0
  45. data/samples/googletesting.coffee +17 -0
  46. data/samples/googletesting.js +23 -0
  47. data/samples/logcolor.coffee +10 -0
  48. data/samples/logcolor.js +11 -0
  49. data/samples/metaextract.coffee +23 -0
  50. data/samples/metaextract.js +29 -0
  51. data/samples/multirun.coffee +37 -0
  52. data/samples/multirun.js +56 -0
  53. data/samples/screenshot.coffee +28 -0
  54. data/samples/screenshot.js +33 -0
  55. data/samples/statushandlers.coffee +15 -0
  56. data/samples/statushandlers.js +19 -0
  57. data/samples/steptimeout.coffee +37 -0
  58. data/samples/steptimeout.js +45 -0
  59. data/samples/timeout.coffee +39 -0
  60. data/samples/timeout.js +47 -0
  61. data/tests/run.js +76 -0
  62. data/tests/site/alert.html +10 -0
  63. data/tests/site/click.html +40 -0
  64. data/tests/site/confirm.html +12 -0
  65. data/tests/site/elementattribute.html +6 -0
  66. data/tests/site/error.html +10 -0
  67. data/tests/site/form.html +26 -0
  68. data/tests/site/global.html +9 -0
  69. data/tests/site/images/phantom.png +0 -0
  70. data/tests/site/index.html +17 -0
  71. data/tests/site/mouse-events.html +47 -0
  72. data/tests/site/multiple-forms.html +16 -0
  73. data/tests/site/page1.html +8 -0
  74. data/tests/site/page2.html +8 -0
  75. data/tests/site/page3.html +8 -0
  76. data/tests/site/prompt.html +12 -0
  77. data/tests/site/resources.html +16 -0
  78. data/tests/site/result.html +11 -0
  79. data/tests/site/test.html +10 -0
  80. data/tests/site/visible.html +17 -0
  81. data/tests/site/waitFor.html +22 -0
  82. data/tests/suites/casper/agent.js +24 -0
  83. data/tests/suites/casper/capture.js +31 -0
  84. data/tests/suites/casper/click.js +61 -0
  85. data/tests/suites/casper/confirm.js +21 -0
  86. data/tests/suites/casper/elementattribute.js +8 -0
  87. data/tests/suites/casper/encode.js +20 -0
  88. data/tests/suites/casper/evaluate.js +27 -0
  89. data/tests/suites/casper/events.js +38 -0
  90. data/tests/suites/casper/exists.js +9 -0
  91. data/tests/suites/casper/fetchtext.js +9 -0
  92. data/tests/suites/casper/flow.coffee +38 -0
  93. data/tests/suites/casper/formfill.js +69 -0
  94. data/tests/suites/casper/global.js +9 -0
  95. data/tests/suites/casper/history.js +21 -0
  96. data/tests/suites/casper/hooks.js +41 -0
  97. data/tests/suites/casper/logging.js +38 -0
  98. data/tests/suites/casper/mouseevents.js +27 -0
  99. data/tests/suites/casper/onerror.js +19 -0
  100. data/tests/suites/casper/open.js +73 -0
  101. data/tests/suites/casper/prompt.js +17 -0
  102. data/tests/suites/casper/resources.coffee +24 -0
  103. data/tests/suites/casper/start.js +15 -0
  104. data/tests/suites/casper/steps.js +32 -0
  105. data/tests/suites/casper/viewport.js +11 -0
  106. data/tests/suites/casper/visible.js +17 -0
  107. data/tests/suites/casper/wait.js +27 -0
  108. data/tests/suites/casper/xpath.js +32 -0
  109. data/tests/suites/cli.js +125 -0
  110. data/tests/suites/clientutils.js +84 -0
  111. data/tests/suites/coffee.coffee +19 -0
  112. data/tests/suites/fs.js +36 -0
  113. data/tests/suites/http_status.js +28 -0
  114. data/tests/suites/injector.js +64 -0
  115. data/tests/suites/tester.js +121 -0
  116. data/tests/suites/utils.js +209 -0
  117. data/tests/suites/xunit.js +16 -0
  118. data/tests/testdir/01_a/abc.js +0 -0
  119. data/tests/testdir/01_a/def.js +0 -0
  120. data/tests/testdir/02_b/abc.js +0 -0
  121. data/tests/testdir/03_a.js +0 -0
  122. data/tests/testdir/03_b.js +0 -0
  123. data/tests/testdir/04/01_init.js +0 -0
  124. data/tests/testdir/04/02_do.js +0 -0
  125. metadata +192 -0
@@ -0,0 +1,41 @@
1
+ // Dear curious test reader,
2
+ // The on* family of methods is considered deprecated since 0.6.0; please use events instead
3
+
4
+ // Casper.options.onStepComplete
5
+ casper.start('tests/site/index.html', function() {
6
+ this.options.onStepComplete = function(self, stepResult) {
7
+ this.test.comment('Casper.options.onStepComplete()');
8
+ this.test.assertEquals(stepResult, 'ok', 'Casper.options.onStepComplete() is called on step complete');
9
+ self.options.onStepComplete = null;
10
+ };
11
+ return 'ok';
12
+ });
13
+
14
+ // Casper.options.onResourceRequested & Casper.options.onResourceReceived
15
+ casper.then(function() {
16
+ this.options.onResourceReceived = function(self, resource) {
17
+ this.test.comment('Casper.options.onResourceReceived()');
18
+ this.test.assertType(resource, 'object', 'Casper.options.onResourceReceived() retrieve a resource object');
19
+ this.test.assert('status' in resource, 'Casper.options.onResourceReceived() retrieve a valid resource object');
20
+ self.options.onResourceReceived = null;
21
+ };
22
+ this.options.onResourceRequested = function(self, request) {
23
+ this.test.comment('Casper.options.onResourceRequested()');
24
+ this.test.assertType(request, 'object', 'Casper.options.onResourceRequested() retrieve a request object');
25
+ this.test.assert('method' in request, 'Casper.options.onResourceRequested() retrieve a valid request object');
26
+ self.options.onResourceRequested = null;
27
+ };
28
+ this.thenOpen('tests/site/page1.html');
29
+ });
30
+
31
+ // Casper.options.onAlert()
32
+ casper.then(function() {
33
+ this.options.onAlert = function(self, message) {
34
+ self.test.assertEquals(message, 'plop', 'Casper.options.onAlert() can intercept an alert message');
35
+ };
36
+ });
37
+
38
+ casper.run(function() {
39
+ this.options.onAlert = null;
40
+ this.test.done();
41
+ });
@@ -0,0 +1,38 @@
1
+ casper.start('tests/site/index.html');
2
+
3
+ var oldLevel = casper.options.logLevel;
4
+
5
+ casper.options.logLevel = 'info';
6
+ casper.options.verbose = false;
7
+
8
+ casper.test.comment('Casper.log()');
9
+ casper.log('foo', 'info');
10
+ casper.test.assert(casper.result.log.some(function(e) {
11
+ return e.message === 'foo' && e.level === 'info';
12
+ }), 'Casper.log() adds a log entry');
13
+
14
+ casper.options.logLevel = oldLevel;
15
+ casper.options.verbose = true;
16
+
17
+ casper.then(function() {
18
+ var oldLevel = casper.options.logLevel;
19
+ casper.options.logLevel = 'debug';
20
+ casper.options.verbose = false;
21
+ casper.evaluate(function() {
22
+ __utils__.log('debug message');
23
+ __utils__.log('info message', 'info');
24
+ });
25
+ this.test.assert(casper.result.log.some(function(e) {
26
+ return e.message === 'debug message' && e.level === 'debug' && e.space === 'remote';
27
+ }), 'ClientUtils.log() adds a log entry');
28
+ this.test.assert(casper.result.log.some(function(e) {
29
+ return e.message === 'info message' && e.level === 'info' && e.space === 'remote';
30
+ }), 'ClientUtils.log() adds a log entry at a given level');
31
+ casper.options.logLevel = oldLevel;
32
+ casper.options.verbose = true;
33
+ });
34
+
35
+ casper.run(function() {
36
+ this.test.assertEquals(this.result.log.length, 3, 'Casper.log() logged messages');
37
+ this.test.done();
38
+ });
@@ -0,0 +1,27 @@
1
+ casper.start('tests/site/mouse-events.html');
2
+
3
+ casper.then(function() {
4
+ this.test.comment('CasperUtils.mouseEvent()');
5
+ this.test.assert(this.mouseEvent('mousedown', '#test1'), 'CasperUtils.mouseEvent() can dispatch a mousedown event');
6
+ this.test.assert(this.mouseEvent('mousedown', '#test2'), 'CasperUtils.mouseEvent() can dispatch a mousedown event handled by unobstrusive js');
7
+ this.test.assert(this.mouseEvent('mouseup', '#test3'), 'CasperUtils.mouseEvent() can dispatch a mouseup event');
8
+ this.test.assert(this.mouseEvent('mouseup', '#test4'), 'CasperUtils.mouseEvent() can dispatch a mouseup event handled by unobstrusive js');
9
+ this.test.assert(this.mouseEvent('mouseover', '#test5'), 'CasperUtils.mouseEvent() can dispatch a mouseover event');
10
+ this.test.assert(this.mouseEvent('mouseover', '#test6'), 'CasperUtils.mouseEvent() can dispatch a mouseover event handled by unobstrusive js');
11
+ this.test.assert(this.mouseEvent('mouseout', '#test7'), 'CasperUtils.mouseEvent() can dispatch a mouseout event');
12
+ this.test.assert(this.mouseEvent('mouseout', '#test8'), 'CasperUtils.mouseEvent() can dispatch a mouseout event handled by unobstrusive js');
13
+
14
+ var results = this.getGlobal('results');
15
+ this.test.assert(results.test1, 'CasperUtils.mouseEvent() triggered mousedown');
16
+ this.test.assert(results.test2, 'CasperUtils.mouseEvent() triggered mousedown via unobstrusive js');
17
+ this.test.assert(results.test3, 'CasperUtils.mouseEvent() triggered mouseup');
18
+ this.test.assert(results.test4, 'CasperUtils.mouseEvent() triggered mouseup via unobstrusive js');
19
+ this.test.assert(results.test5, 'CasperUtils.mouseEvent() triggered mouseover');
20
+ this.test.assert(results.test6, 'CasperUtils.mouseEvent() triggered mouseover via unobstrusive js');
21
+ this.test.assert(results.test7, 'CasperUtils.mouseEvent() triggered mouseout');
22
+ this.test.assert(results.test8, 'CasperUtils.mouseEvent() triggered mouseout via unobstrusive js');
23
+ });
24
+
25
+ casper.run(function() {
26
+ this.test.done();
27
+ });
@@ -0,0 +1,19 @@
1
+ casper.test.comment("page.error event");
2
+
3
+ var error = {};
4
+
5
+ casper.start();
6
+
7
+ casper.on("page.error", function onError(msg, trace) {
8
+ error.msg = msg;
9
+ error.trace = trace;
10
+ });
11
+
12
+ casper.thenOpen('tests/site/error.html', function() {
13
+ this.test.assertEquals(error.msg, "ReferenceError: Can't find variable: plop", 'page.error event has been caught OK');
14
+ this.test.assertMatch(error.trace[0].file, /error.html/, 'page.error retrieves correct stack trace');
15
+ });
16
+
17
+ casper.run(function() {
18
+ this.test.done();
19
+ });
@@ -0,0 +1,73 @@
1
+ var t = casper.test, current = 0, tests = [
2
+ function(settings) {
3
+ t.assertEquals(settings, {
4
+ method: "get"
5
+ }, "Casper.open() used the expected GET settings");
6
+ },
7
+ function(settings) {
8
+ t.assertEquals(settings, {
9
+ method: "post",
10
+ data: "plop=42&chuck=norris"
11
+ }, "Casper.open() used the expected POST settings");
12
+ },
13
+ function(settings) {
14
+ t.assertEquals(settings, {
15
+ method: "put",
16
+ data: "plop=42&chuck=norris"
17
+ }, "Casper.open() used the expected PUT settings");
18
+ },
19
+ function(settings) {
20
+ t.assertEquals(settings, {
21
+ method: "get",
22
+ username: 'bob',
23
+ password: 'sinclar'
24
+ }, "Casper.open() used the expected HTTP auth settings");
25
+ }
26
+ ];
27
+
28
+ casper.start();
29
+
30
+ casper.on('open', function(url, settings) {
31
+ tests[current++](settings);
32
+ });
33
+
34
+ // GET
35
+ casper.open('tests/site/index.html').then(function() {
36
+ t.pass("Casper.open() can open and load a location using GET");
37
+ });
38
+
39
+ // POST
40
+ casper.open('tests/site/index.html', {
41
+ method: 'post',
42
+ data: {
43
+ plop: 42,
44
+ chuck: 'norris'
45
+ }
46
+ }).then(function() {
47
+ t.pass("Casper.open() can open and load a location using POST");
48
+ });
49
+
50
+ // PUT
51
+ casper.open('tests/site/index.html', {
52
+ method: 'put',
53
+ data: {
54
+ plop: 42,
55
+ chuck: 'norris'
56
+ }
57
+ }).then(function() {
58
+ t.pass("Casper.open() can open and load a location using PUT");
59
+ });
60
+
61
+ // HTTP Auth
62
+ casper.open('tests/site/index.html', {
63
+ method: 'get',
64
+ username: 'bob',
65
+ password: 'sinclar'
66
+ }).then(function() {
67
+ t.pass("Casper.open() can open and load a location using HTTP auth");
68
+ });
69
+
70
+ casper.run(function() {
71
+ this.removeAllListeners('open');
72
+ t.done();
73
+ });
@@ -0,0 +1,17 @@
1
+ // skip this test for phantom versions < 1.5
2
+ if (phantom.version.major === 1 && phantom.version.minor < 6) {
3
+ casper.test.comment('Skipped tests, PhantomJS 1.6 required');
4
+ casper.test.done();
5
+ } else {
6
+ casper.setFilter('page.prompt', function(message, value) {
7
+ return 'Chuck ' + value;
8
+ });
9
+
10
+ casper.start('tests/site/prompt.html', function() {
11
+ this.test.assertEquals(this.getGlobal('name'), 'Chuck Norris', 'prompted value has been received');
12
+ });
13
+
14
+ casper.run(function() {
15
+ this.test.done();
16
+ });
17
+ }
@@ -0,0 +1,24 @@
1
+ casper.start "tests/site/resources.html", ->
2
+ @test.assertEquals @resources.length, 1, "only one resource found"
3
+ onTime = ->
4
+ @test.assertEquals(
5
+ @resources.length
6
+ 2
7
+ "two resources found"
8
+ )
9
+ @test.assertResourceExists(
10
+ /phantom\.png/i
11
+ "phantom image found via test RegExp"
12
+ )
13
+ @test.assertResourceExists(
14
+ (res) -> res.url.match "phantom.png"
15
+ "phantom image found via test Function"
16
+ )
17
+ @test.assertResourceExists(
18
+ "phantom.png"
19
+ "phantom image found via test String"
20
+ )
21
+ onTimeout = -> @test.fail "waitForResource timeout occured"
22
+ @waitForResource "phantom.png", onTime, onTimeout
23
+
24
+ casper.run(-> @test.done())
@@ -0,0 +1,15 @@
1
+ casper.test.comment('Casper.start()');
2
+
3
+ casper.start('tests/site/index.html', function() {
4
+ this.test.pass('Casper.start() can chain a next step');
5
+ this.test.assertTitle('CasperJS test index', 'Casper.start() opened the passed url');
6
+ this.test.assertEval(function() {
7
+ return typeof(__utils__) === "object";
8
+ }, 'Casper.start() injects ClientUtils instance within remote DOM');
9
+ });
10
+
11
+ casper.test.assert(casper.started, 'Casper.start() started');
12
+
13
+ casper.run(function() {
14
+ this.test.done();
15
+ });
@@ -0,0 +1,32 @@
1
+ casper.test.comment('Casper.then()');
2
+
3
+ casper.start('tests/site/index.html');
4
+
5
+ var nsteps = casper.steps.length;
6
+
7
+ casper.then(function(self) {
8
+ this.test.assertTitle('CasperJS test index', 'Casper.then() added a new step');
9
+ });
10
+
11
+ casper.test.assertEquals(casper.steps.length, nsteps + 1, 'Casper.then() can add a new step');
12
+
13
+ casper.test.comment('Casper.thenOpen()');
14
+
15
+ casper.thenOpen('tests/site/test.html');
16
+
17
+ casper.test.assertEquals(casper.steps.length, nsteps + 2, 'Casper.thenOpen() can add a new step');
18
+
19
+ casper.thenOpen('tests/site/test.html', function() {
20
+ this.test.assertTitle('CasperJS test target', 'Casper.thenOpen() opened a location and executed a step');
21
+ });
22
+
23
+ casper.test.assertEquals(casper.steps.length, nsteps + 4, 'Casper.thenOpen() can add a new step for opening, plus another step');
24
+
25
+ casper.test.comment('Casper.each()');
26
+ casper.each([1, 2, 3], function(self, item, i) {
27
+ self.test.assertEquals(i, item - 1, 'Casper.each() passes a contextualized index');
28
+ });
29
+
30
+ casper.run(function() {
31
+ this.test.done();
32
+ });
@@ -0,0 +1,11 @@
1
+ casper.test.comment('Casper.viewport()');
2
+
3
+ casper.start();
4
+
5
+ casper.viewport(1337, 999);
6
+
7
+ casper.test.assertEquals(casper.page.viewportSize.width, 1337, 'Casper.viewport() can change the width of page viewport');
8
+ casper.test.assertEquals(casper.page.viewportSize.height, 999, 'Casper.viewport() can change the height of page viewport');
9
+ casper.test.assertRaises(casper.viewport, ['a', 'b'], 'Casper.viewport() validates viewport size data');
10
+
11
+ casper.test.done();
@@ -0,0 +1,17 @@
1
+ casper.start('tests/site/visible.html', function() {
2
+ this.test.comment('Casper.visible()');
3
+ this.test.assert(this.visible('#img1'), 'Casper.visible() can detect if an element is visible');
4
+ this.test.assert(!this.visible('#img2'), 'Casper.visible() can detect if an element is invisible');
5
+ this.test.assert(!this.visible('#img3'), 'Casper.visible() can detect if an element is invisible');
6
+ this.waitWhileVisible('#img1', function() {
7
+ this.test.comment('Casper.waitWhileVisible()');
8
+ this.test.pass('Casper.waitWhileVisible() can wait while an element is visible');
9
+ }, function() {
10
+ this.test.comment('Casper.waitWhileVisible()');
11
+ this.test.fail('Casper.waitWhileVisible() can wait while an element is visible');
12
+ }, 2000);
13
+ });
14
+
15
+ casper.run(function() {
16
+ this.test.done();
17
+ });
@@ -0,0 +1,27 @@
1
+ var waitStart;
2
+
3
+ casper.start('tests/site/index.html', function() {
4
+ waitStart = new Date().getTime();
5
+ });
6
+
7
+ casper.wait(1000, function() {
8
+ this.test.comment('Casper.wait()');
9
+ this.test.assert(new Date().getTime() - waitStart > 1000, 'Casper.wait() can wait for a given amount of time');
10
+ // Casper.waitFor()
11
+ casper.thenOpen('tests/site/waitFor.html', function() {
12
+ this.test.comment('Casper.waitFor()');
13
+ this.waitFor(function() {
14
+ return this.evaluate(function() {
15
+ return document.querySelectorAll('li').length === 4;
16
+ });
17
+ }, function() {
18
+ this.test.pass('Casper.waitFor() can wait for something to happen');
19
+ }, function() {
20
+ this.test.fail('Casper.waitFor() can wait for something to happen');
21
+ });
22
+ });
23
+ });
24
+
25
+ casper.run(function() {
26
+ this.test.done();
27
+ });
@@ -0,0 +1,32 @@
1
+ var x = require('casper').selectXPath;
2
+
3
+ casper.test.comment('XPath');
4
+
5
+ casper.start('tests/site/index.html', function() {
6
+ this.test.assertExists({
7
+ type: 'xpath',
8
+ path: '/html/body/ul/li[2]'
9
+ }, 'XPath selector can find an element');
10
+ this.test.assertDoesntExist({
11
+ type: 'xpath',
12
+ path: '/html/body/ol/li[2]'
13
+ }, 'XPath selector does not retrieve an unexistent element');
14
+ this.test.assertExists(x('/html/body/ul/li[2]'), 'selectXPath() shortcut can find an element as well');
15
+ this.test.assertEvalEquals(function() {
16
+ return __utils__.findAll({type: 'xpath', path: '/html/body/ul/li'}).length;
17
+ }, 3, 'Correct number of elements are found');
18
+ });
19
+
20
+ casper.thenClick(x('/html/body/a[2]'), function() {
21
+ this.test.assertTitle('CasperJS test form', 'Clicking XPath works as expected');
22
+ this.fill(x('/html/body/form'), {
23
+ email: 'chuck@norris.com'
24
+ });
25
+ this.test.assertEvalEquals(function() {
26
+ return document.querySelector('input[name="email"]').value;
27
+ }, 'chuck@norris.com', 'Casper.fill() can fill an input[type=text] form field');
28
+ });
29
+
30
+ casper.run(function() {
31
+ this.test.done();
32
+ });
@@ -0,0 +1,125 @@
1
+ var cli = require('cli'), t = casper.test;
2
+
3
+ t.comment('parse(), get(), has()');
4
+
5
+ (function(parsed) {
6
+ // clean
7
+ t.assertEquals(parsed.args, [], 'parse() returns expected positional args array');
8
+ t.assertEquals(parsed.options, {}, 'parse() returns expected options object');
9
+ t.assertEquals(parsed.get(0), undefined, 'parse() does not return inexistant positional arg');
10
+ t.assertEquals(parsed.get('blah'), undefined, 'parse() does not return inexistant option');
11
+ t.assert(!parsed.has(0), 'has() checks if an arg is set');
12
+ t.assert(!parsed.has('blah'), 'has() checks if an option is set');
13
+ // raw
14
+ t.assertEquals(parsed.raw.args, [], 'parse() returns expected positional args array');
15
+ t.assertEquals(parsed.raw.options, {}, 'parse() returns expected options object');
16
+ t.assertEquals(parsed.raw.get(0), undefined, 'parse() does not return inexistant positional arg');
17
+ t.assertEquals(parsed.raw.get('blah'), undefined, 'parse() does not return inexistant option');
18
+ t.assert(!parsed.raw.has(0), 'has() checks if a raw arg is set');
19
+ t.assert(!parsed.raw.has('blah'), 'has() checks if a raw option is set');
20
+ })(cli.parse([]));
21
+
22
+ (function(parsed) {
23
+ // clean
24
+ t.assertEquals(parsed.args, ['foo', 'bar'], 'parse() returns expected positional args array');
25
+ t.assertEquals(parsed.options, {}, 'parse() returns expected options object');
26
+ t.assertEquals(parsed.get(0), 'foo', 'parse() retrieve first positional arg');
27
+ t.assertEquals(parsed.get(1), 'bar', 'parse() retrieve second positional arg');
28
+ t.assert(parsed.has(0), 'has() checks if an arg is set');
29
+ t.assert(parsed.has(1), 'has() checks if an arg is set');
30
+ t.assert(!parsed.has(2), 'has() checks if an arg is not set');
31
+ // raw
32
+ t.assertEquals(parsed.raw.args, ['foo', 'bar'], 'parse() returns expected positional raw args array');
33
+ t.assertEquals(parsed.raw.options, {}, 'parse() returns expected raw options object');
34
+ t.assertEquals(parsed.raw.get(0), 'foo', 'parse() retrieve first positional raw arg');
35
+ t.assertEquals(parsed.raw.get(1), 'bar', 'parse() retrieve second positional raw arg');
36
+ t.assert(parsed.raw.has(0), 'has() checks if a arw arg is set');
37
+ t.assert(parsed.raw.has(1), 'has() checks if a arw arg is set');
38
+ t.assert(!parsed.raw.has(2), 'has() checks if a arw arg is not set');
39
+ })(cli.parse(['foo', 'bar']));
40
+
41
+ (function(parsed) {
42
+ // clean
43
+ t.assertEquals(parsed.args, [], 'parse() returns expected positional args array');
44
+ t.assertEquals(parsed.options, {foo: 'bar', baz: true}, 'parse() returns expected options object');
45
+ t.assertEquals(parsed.get('foo'), 'bar', 'parse() retrieve an option value');
46
+ t.assert(parsed.get('baz'), 'parse() retrieve boolean option flag');
47
+ t.assert(parsed.has("foo"), 'has() checks if an option is set');
48
+ t.assert(parsed.has("baz"), 'has() checks if an option is set');
49
+ // raw
50
+ t.assertEquals(parsed.raw.args, [], 'parse() returns expected positional raw args array');
51
+ t.assertEquals(parsed.raw.options, {foo: 'bar', baz: true}, 'parse() returns expected options raw object');
52
+ t.assertEquals(parsed.raw.get('foo'), 'bar', 'parse() retrieve an option raw value');
53
+ t.assert(parsed.raw.get('baz'), 'parse() retrieve boolean raw option flag');
54
+ t.assert(parsed.raw.has("foo"), 'has() checks if a raw option is set');
55
+ t.assert(parsed.raw.has("baz"), 'has() checks if a raw option is set');
56
+ })(cli.parse(['--foo=bar', '--baz']));
57
+
58
+ (function(parsed) {
59
+ // clean
60
+ t.assertEquals(parsed.args, [], 'parse() returns expected positional args array');
61
+ t.assertEquals(parsed.options, { '&é"à': "42===42" }, 'parse() returns expected options object');
62
+ t.assertEquals(parsed.get('&é"à'), "42===42", 'parse() handles options with exotic names');
63
+ t.assert(parsed.has('&é"à'), 'has() checks if an option is set');
64
+ // raw
65
+ t.assertEquals(parsed.raw.args, [], 'parse() returns expected positional raw args array');
66
+ t.assertEquals(parsed.raw.options, { '&é"à': "42===42" }, 'parse() returns expected options raw object');
67
+ t.assertEquals(parsed.raw.get('&é"à'), "42===42", 'parse() handles raw options with exotic names');
68
+ t.assert(parsed.raw.has('&é"à'), 'has() checks if a raw option is set');
69
+ })(cli.parse(['--&é"à=42===42']));
70
+
71
+ (function(parsed) {
72
+ // clean
73
+ t.assertEquals(parsed.args, ['foo & bar', 'baz & boz'], 'parse() returns expected positional args array');
74
+ t.assertEquals(parsed.options, { universe: 42, lap: 13.37, chucknorris: true, oops: false }, 'parse() returns expected options object');
75
+ t.assertEquals(parsed.get('universe'), 42, 'parse() can cast a numeric option value');
76
+ t.assertEquals(parsed.get('lap'), 13.37, 'parse() can cast a float option value');
77
+ t.assertType(parsed.get('lap'), "number", 'parse() can cast a boolean value');
78
+ t.assert(parsed.get('chucknorris'), 'parse() can get a flag value by its option name');
79
+ t.assertType(parsed.get('oops'), "boolean", 'parse() can cast a boolean value');
80
+ t.assertEquals(parsed.get('oops'), false, 'parse() can cast a boolean value');
81
+ t.assert(parsed.has(0), 'has() checks if an arg is set');
82
+ t.assert(parsed.has(1), 'has() checks if an arg is set');
83
+ t.assert(parsed.has("universe"), 'has() checks if an option is set');
84
+ t.assert(parsed.has("lap"), 'has() checks if an option is set');
85
+ t.assert(parsed.has("chucknorris"), 'has() checks if an option is set');
86
+ t.assert(parsed.has("oops"), 'has() checks if an option is set');
87
+
88
+ t.comment('drop()');
89
+
90
+ parsed.drop(0);
91
+ t.assertEquals(parsed.get(0), 'baz & boz', 'drop() dropped arg');
92
+ parsed.drop("universe");
93
+ t.assert(!parsed.has("universe"), 'drop() dropped option');
94
+ t.assertEquals(parsed.args, ["baz & boz"], 'drop() did not affect other args');
95
+ t.assertEquals(parsed.options, {
96
+ lap: 13.37,
97
+ chucknorris: true,
98
+ oops: false
99
+ }, 'drop() did not affect other options');
100
+
101
+ // raw
102
+ t.assertEquals(parsed.raw.args, ['foo & bar', 'baz & boz'], 'parse() returns expected positional raw args array');
103
+ t.assertEquals(parsed.raw.options, { universe: "42", lap: "13.37", chucknorris: true, oops: "false" }, 'parse() returns expected options raw object');
104
+ t.assertEquals(parsed.raw.get('universe'), "42", 'parse() does not a raw numeric option value');
105
+ t.assertEquals(parsed.raw.get('lap'), "13.37", 'parse() does not cast a raw float option value');
106
+ t.assertType(parsed.raw.get('lap'), "string", 'parse() does not cast a numeric value');
107
+ t.assert(parsed.raw.get('chucknorris'), 'parse() can get a flag value by its option name');
108
+ t.assertType(parsed.raw.get('oops'), "string", 'parse() can cast a boolean value');
109
+ t.assertEquals(parsed.raw.get('oops'), "false", 'parse() can cast a boolean value');
110
+
111
+ t.comment('drop() for raw');
112
+
113
+ parsed.raw.drop(0);
114
+ t.assertEquals(parsed.raw.get(0), 'baz & boz', 'drop() dropped raw arg');
115
+ parsed.raw.drop("universe");
116
+ t.assert(!parsed.raw.has("universe"), 'drop() dropped raw option');
117
+ t.assertEquals(parsed.raw.args, ["baz & boz"], 'drop() did not affect other raw args');
118
+ t.assertEquals(parsed.raw.options, {
119
+ lap: "13.37",
120
+ chucknorris: true,
121
+ oops: "false"
122
+ }, 'drop() did not affect other raw options');
123
+ })(cli.parse(['foo & bar', 'baz & boz', '--universe=42', '--lap=13.37', '--chucknorris', '--oops=false']));
124
+
125
+ t.done();