corrade-nucleus-nucleons

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 19  →  ?path2? @ 20
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/css/node.mustache
@@ -0,0 +1,269 @@
/*
{{&header_text}}
 
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/*jshint unused:false */
 
function run_css_tests(test_obj, Urlencoded, js_beautify, html_beautify, css_beautify)
{
 
var default_opts = {
indent_size: 4,
indent_char: ' ',
preserve_newlines: true,
jslint_happy: false,
keep_array_indentation: false,
brace_style: 'collapse',
space_before_conditional: true,
break_chained_methods: false,
selector_separator: '\n',
end_with_newline: false
};
var opts;
 
{{#default_options}} default_opts.{{name}} = {{&value}};
{{/default_options}}
 
function reset_options()
{
opts = JSON.parse(JSON.stringify(default_opts));
}
 
function test_css_beautifier(input)
{
return css_beautify(input, opts);
}
 
var sanitytest;
 
// test the input on beautifier with the current flag settings
// does not check the indentation / surroundings as bt() does
function test_fragment(input, expected)
{
expected = expected || expected === '' ? expected : input;
sanitytest.expect(input, expected);
// if the expected is different from input, run it again
// expected output should be unchanged when run twice.
if (expected !== input) {
sanitytest.expect(expected, expected);
}
 
// Everywhere we do newlines, they should be replaced with opts.eol
opts.eol = '\r\\n';
expected = expected.replace(/[\n]/g, '\r\n');
sanitytest.expect(input, expected);
if (input.indexOf('\n') !== -1) {
input = input.replace(/[\n]/g, '\r\n');
sanitytest.expect(input, expected);
// Ensure support for auto eol detection
opts.eol = 'auto';
sanitytest.expect(input, expected);
}
opts.eol = '\n';
}
 
// test css
function t(input, expectation)
{
var wrapped_input, wrapped_expectation;
 
expectation = expectation || expectation === '' ? expectation : input;
sanitytest.test_function(test_css_beautifier, 'css_beautify');
test_fragment(input, expectation);
}
 
function unicode_char(value) {
return String.fromCharCode(value);
}
 
function beautifier_tests()
{
sanitytest = test_obj;
 
reset_options();
//============================================================
t(".tabs {}");
 
{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}
//============================================================
{{^matrix}}
// {{&name}}
reset_options();
{{#options}}
opts.{{name}} = {{&value}};
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}};
{{/tests}}
 
{{/matrix}}
{{#matrix}}
// {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})
reset_options();
{{#options}}
opts.{{name}} = {{&value}};
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}};
{{/tests}}
 
{{/matrix}}
{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}
}
 
function beautifier_unconverted_tests()
{
sanitytest = test_obj;
 
reset_options();
//============================================================
// test basic css beautifier
t(".tabs {}");
t(".tabs{color:red;}", ".tabs {\n\tcolor: red;\n}");
t(".tabs{color:rgb(255, 255, 0)}", ".tabs {\n\tcolor: rgb(255, 255, 0)\n}");
t(".tabs{background:url('back.jpg')}", ".tabs {\n\tbackground: url('back.jpg')\n}");
t("#bla, #foo{color:red}", "#bla,\n#foo {\n\tcolor: red\n}");
t("@media print {.tab{}}", "@media print {\n\t.tab {}\n}");
t("@media print {.tab{background-image:url(foo@2x.png)}}", "@media print {\n\t.tab {\n\t\tbackground-image: url(foo@2x.png)\n\t}\n}");
 
t("a:before {\n" +
"\tcontent: 'a{color:black;}\"\"\\'\\'\"\\n\\n\\na{color:black}\';\n" +
"}");
 
//lead-in whitespace determines base-indent.
// lead-in newlines are stripped.
t("\n\na, img {padding: 0.2px}", "a,\nimg {\n\tpadding: 0.2px\n}");
t(" a, img {padding: 0.2px}", " a,\n img {\n \tpadding: 0.2px\n }");
t(" \t \na, img {padding: 0.2px}", " \t a,\n \t img {\n \t \tpadding: 0.2px\n \t }");
t("\n\n a, img {padding: 0.2px}", "a,\nimg {\n\tpadding: 0.2px\n}");
 
// separate selectors
t("#bla, #foo{color:red}", "#bla,\n#foo {\n\tcolor: red\n}");
t("a, img {padding: 0.2px}", "a,\nimg {\n\tpadding: 0.2px\n}");
 
// block nesting
t("#foo {\n\tbackground-image: url(foo@2x.png);\n\t@font-face {\n\t\tfont-family: 'Bitstream Vera Serif Bold';\n\t\tsrc: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\n\t}\n}");
t("@media screen {\n\t#foo:hover {\n\t\tbackground-image: url(foo@2x.png);\n\t}\n\t@font-face {\n\t\tfont-family: 'Bitstream Vera Serif Bold';\n\t\tsrc: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\n\t}\n}");
/*
@font-face {
font-family: 'Bitstream Vera Serif Bold';
src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');
}
@media screen {
#foo:hover {
background-image: url(foo.png);
}
@media screen and (min-device-pixel-ratio: 2) {
@font-face {
font-family: 'Helvetica Neue'
}
#foo:hover {
background-image: url(foo@2x.png);
}
}
}
*/
t("@font-face {\n\tfont-family: 'Bitstream Vera Serif Bold';\n\tsrc: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\n}\n@media screen {\n\t#foo:hover {\n\t\tbackground-image: url(foo.png);\n\t}\n\t@media screen and (min-device-pixel-ratio: 2) {\n\t\t@font-face {\n\t\t\tfont-family: 'Helvetica Neue'\n\t\t}\n\t\t#foo:hover {\n\t\t\tbackground-image: url(foo@2x.png);\n\t\t}\n\t}\n}");
 
// less-css cases
t('.well{@well-bg:@bg-color;@well-fg:@fg-color;}','.well {\n\t@well-bg: @bg-color;\n\t@well-fg: @fg-color;\n}');
t('.well {&.active {\nbox-shadow: 0 1px 1px @border-color, 1px 0 1px @border-color;}}',
'.well {\n' +
'\t&.active {\n' +
'\t\tbox-shadow: 0 1px 1px @border-color, 1px 0 1px @border-color;\n' +
'\t}\n' +
'}');
t('a {\n' +
'\tcolor: blue;\n' +
'\t&:hover {\n' +
'\t\tcolor: green;\n' +
'\t}\n' +
'\t& & &&&.active {\n' +
'\t\tcolor: green;\n' +
'\t}\n' +
'}');
 
// Not sure if this is sensible
// but I believe it is correct to not remove the space in "&: hover".
t('a {\n' +
'\t&: hover {\n' +
'\t\tcolor: green;\n' +
'\t}\n' +
'}');
 
// import
t('@import "test";');
 
// don't break nested pseudo-classes
t("a:first-child{color:red;div:first-child{color:black;}}",
"a:first-child {\n\tcolor: red;\n\tdiv:first-child {\n\t\tcolor: black;\n\t}\n}");
 
// handle SASS/LESS parent reference
t("div{&:first-letter {text-transform: uppercase;}}",
"div {\n\t&:first-letter {\n\t\ttext-transform: uppercase;\n\t}\n}");
 
//nested modifiers (&:hover etc)
t(".tabs{&:hover{width:10px;}}", ".tabs {\n\t&:hover {\n\t\twidth: 10px;\n\t}\n}");
t(".tabs{&.big{width:10px;}}", ".tabs {\n\t&.big {\n\t\twidth: 10px;\n\t}\n}");
t(".tabs{&>big{width:10px;}}", ".tabs {\n\t&>big {\n\t\twidth: 10px;\n\t}\n}");
t(".tabs{&+.big{width:10px;}}", ".tabs {\n\t&+.big {\n\t\twidth: 10px;\n\t}\n}");
 
//nested rules
t(".tabs{.child{width:10px;}}", ".tabs {\n\t.child {\n\t\twidth: 10px;\n\t}\n}");
 
//variables
t("@myvar:10px;.tabs{width:10px;}", "@myvar: 10px;\n.tabs {\n\twidth: 10px;\n}");
t("@myvar:10px; .tabs{width:10px;}", "@myvar: 10px;\n.tabs {\n\twidth: 10px;\n}");
 
// test options
opts.indent_size = 2;
opts.indent_char = ' ';
opts.selector_separator_newline = false;
 
// pseudo-classes and pseudo-elements
t("#foo:hover {\n background-image: url(foo@2x.png)\n}");
t("#foo *:hover {\n color: purple\n}");
t("::selection {\n color: #ff0000;\n}");
 
// TODO: don't break nested pseduo-classes
t("@media screen {.tab,.bat:hover {color:red}}", "@media screen {\n .tab, .bat:hover {\n color: red\n }\n}");
 
// particular edge case with braces and semicolons inside tags that allows custom text
t("a:not(\"foobar\\\";{}omg\"){\ncontent: 'example\\';{} text';\ncontent: \"example\\\";{} text\";}",
"a:not(\"foobar\\\";{}omg\") {\n content: 'example\\';{} text';\n content: \"example\\\";{} text\";\n}");
 
// may not eat the space before "["
t('html.js [data-custom="123"] {\n opacity: 1.00;\n}');
t('html.js *[data-custom="123"] {\n opacity: 1.00;\n}');
}
 
beautifier_tests();
beautifier_unconverted_tests();
}
 
if (typeof exports !== "undefined") {
exports.run_css_tests = run_css_tests;
}
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/css/python.mustache
@@ -0,0 +1,270 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
'''
{{&header_text}}
 
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'''
 
import unittest
import cssbeautifier
import copy
 
class CSSBeautifierTest(unittest.TestCase):
 
options = None
 
@classmethod
def setUpClass(cls):
false = False
true = True
 
default_options = cssbeautifier.default_options()
default_options.indent_size = 1
default_options.indent_char = '\t'
default_options.selector_separator_newline = true
default_options.end_with_newline = false
default_options.newline_between_rules = false
 
{{#default_options}} default_options.{{name}} = {{&value}}
{{/default_options}}
 
cls.default_options = default_options
 
def reset_options(self):
self.options = copy.copy(self.default_options)
 
def testGenerated(self):
self.reset_options()
test_fragment = self.decodesto
t = self.decodesto
 
false = False
true = True
 
{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}
#============================================================
{{^matrix}}
# {{&name}}
self.reset_options();
{{#options}}
self.options.{{name}} = {{&value}}
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}}
{{/tests}}
 
{{/matrix}}
{{#matrix}}
# {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})
self.reset_options();
{{#options}}
self.options.{{name}} = {{&value}}
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}}
{{/tests}}
 
{{/matrix}}
{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}
 
def testNewline(self):
self.reset_options()
t = self.decodesto
 
self.options.end_with_newline = True
t("", "\n")
t("\n", "\n")
t(".tabs{}\n", ".tabs {}\n")
t(".tabs{}", ".tabs {}\n")
 
def testBasics(self):
self.reset_options()
t = self.decodesto
 
t("", "")
t("\n", "")
t(".tabs{}\n", ".tabs {}")
t(".tabs{}", ".tabs {}")
t(".tabs{color:red}", ".tabs {\n\tcolor: red\n}")
t(".tabs{color:rgb(255, 255, 0)}", ".tabs {\n\tcolor: rgb(255, 255, 0)\n}")
t(".tabs{background:url('back.jpg')}", ".tabs {\n\tbackground: url('back.jpg')\n}")
t("#bla, #foo{color:red}", "#bla,\n#foo {\n\tcolor: red\n}")
t("@media print {.tab{}}", "@media print {\n\t.tab {}\n}")
t("@media print {.tab{background-image:url(foo@2x.png)}}", "@media print {\n\t.tab {\n\t\tbackground-image: url(foo@2x.png)\n\t}\n}")
 
t("a:before {\n" +
"\tcontent: 'a{color:black;}\"\"\\'\\'\"\\n\\n\\na{color:black}\';\n" +
"}");
 
# may not eat the space before "["
t('html.js [data-custom="123"] {\n\topacity: 1.00;\n}')
t('html.js *[data-custom="123"] {\n\topacity: 1.00;\n}')
 
# lead-in whitespace determines base-indent.
# lead-in newlines are stripped.
t("\n\na, img {padding: 0.2px}", "a,\nimg {\n\tpadding: 0.2px\n}")
t(" a, img {padding: 0.2px}", " a,\n img {\n \tpadding: 0.2px\n }")
t(" \t \na, img {padding: 0.2px}", " \t a,\n \t img {\n \t \tpadding: 0.2px\n \t }")
t("\n\n a, img {padding: 0.2px}", "a,\nimg {\n\tpadding: 0.2px\n}")
 
def testSeperateSelectors(self):
self.reset_options()
t = self.decodesto
 
t("#bla, #foo{color:red}", "#bla,\n#foo {\n\tcolor: red\n}")
t("a, img {padding: 0.2px}", "a,\nimg {\n\tpadding: 0.2px\n}")
 
 
def testBlockNesting(self):
self.reset_options()
t = self.decodesto
 
t("#foo {\n\tbackground-image: url(foo@2x.png);\n\t@font-face {\n\t\tfont-family: 'Bitstream Vera Serif Bold';\n\t\tsrc: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\n\t}\n}")
t("@media screen {\n\t#foo:hover {\n\t\tbackground-image: url(foo@2x.png);\n\t}\n\t@font-face {\n\t\tfont-family: 'Bitstream Vera Serif Bold';\n\t\tsrc: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\n\t}\n}")
 
# @font-face {
# font-family: 'Bitstream Vera Serif Bold';
# src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');
# }
# @media screen {
# #foo:hover {
# background-image: url(foo.png);
# }
# @media screen and (min-device-pixel-ratio: 2) {
# @font-face {
# font-family: 'Helvetica Neue'
# }
# #foo:hover {
# background-image: url(foo@2x.png);
# }
# }
# }
t("@font-face {\n\tfont-family: 'Bitstream Vera Serif Bold';\n\tsrc: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\n}\n@media screen {\n\t#foo:hover {\n\t\tbackground-image: url(foo.png);\n\t}\n\t@media screen and (min-device-pixel-ratio: 2) {\n\t\t@font-face {\n\t\t\tfont-family: 'Helvetica Neue'\n\t\t}\n\t\t#foo:hover {\n\t\t\tbackground-image: url(foo@2x.png);\n\t\t}\n\t}\n}")
 
 
def testOptions(self):
self.reset_options()
self.options.indent_size = 2
self.options.indent_char = ' '
self.options.selector_separator_newline = False
t = self.decodesto
 
# pseudo-classes and pseudo-elements
t("#foo:hover {\n background-image: url(foo@2x.png)\n}")
t("#foo *:hover {\n color: purple\n}")
t("::selection {\n color: #ff0000;\n}")
 
# TODO: don't break nested pseduo-classes
t("@media screen {.tab,.bat:hover {color:red}}", "@media screen {\n .tab, .bat:hover {\n color: red\n }\n}")
 
# particular edge case with braces and semicolons inside tags that allows custom text
t( "a:not(\"foobar\\\";{}omg\"){\ncontent: 'example\\';{} text';\ncontent: \"example\\\";{} text\";}",
"a:not(\"foobar\\\";{}omg\") {\n content: 'example\\';{} text';\n content: \"example\\\";{} text\";\n}")
 
def testLessCss(self):
self.reset_options()
t = self.decodesto
 
t('.well{ \n @well-bg:@bg-color;@well-fg:@fg-color;}','.well {\n\t@well-bg: @bg-color;\n\t@well-fg: @fg-color;\n}')
t('.well {&.active {\nbox-shadow: 0 1px 1px @border-color, 1px 0 1px @border-color;}}',
'.well {\n' +
'\t&.active {\n' +
'\t\tbox-shadow: 0 1px 1px @border-color, 1px 0 1px @border-color;\n' +
'\t}\n' +
'}')
t('a {\n' +
'\tcolor: blue;\n' +
'\t&:hover {\n' +
'\t\tcolor: green;\n' +
'\t}\n' +
'\t& & &&&.active {\n' +
'\t\tcolor: green;\n' +
'\t}\n' +
'}')
 
# Not sure if this is sensible
# but I believe it is correct to not remove the space in "&: hover".
t('a {\n' +
'\t&: hover {\n' +
'\t\tcolor: green;\n' +
'\t}\n' +
'}');
 
# import
t('@import "test";');
 
# don't break nested pseudo-classes
t("a:first-child{color:red;div:first-child{color:black;}}",
"a:first-child {\n\tcolor: red;\n\tdiv:first-child {\n\t\tcolor: black;\n\t}\n}");
 
# handle SASS/LESS parent reference
t("div{&:first-letter {text-transform: uppercase;}}",
"div {\n\t&:first-letter {\n\t\ttext-transform: uppercase;\n\t}\n}");
 
# nested modifiers (&:hover etc)
t(".tabs{&:hover{width:10px;}}", ".tabs {\n\t&:hover {\n\t\twidth: 10px;\n\t}\n}")
t(".tabs{&.big{width:10px;}}", ".tabs {\n\t&.big {\n\t\twidth: 10px;\n\t}\n}")
t(".tabs{&>big{width:10px;}}", ".tabs {\n\t&>big {\n\t\twidth: 10px;\n\t}\n}")
t(".tabs{&+.big{width:10px;}}", ".tabs {\n\t&+.big {\n\t\twidth: 10px;\n\t}\n}")
 
# nested rules
t(".tabs{.child{width:10px;}}", ".tabs {\n\t.child {\n\t\twidth: 10px;\n\t}\n}")
 
# variables
t("@myvar:10px;.tabs{width:10px;}", "@myvar: 10px;\n.tabs {\n\twidth: 10px;\n}")
t("@myvar:10px; .tabs{width:10px;}", "@myvar: 10px;\n.tabs {\n\twidth: 10px;\n}")
 
def decodesto(self, input, expectation=None):
if expectation == None:
expectation = input
 
self.assertMultiLineEqual(
cssbeautifier.beautify(input, self.options), expectation)
 
# if the expected is different from input, run it again
# expected output should be unchanged when run twice.
if not expectation != input:
self.assertMultiLineEqual(
cssbeautifier.beautify(expectation, self.options), expectation)
 
# Everywhere we do newlines, they should be replaced with opts.eol
self.options.eol = '\r\\n';
expectation = expectation.replace('\n', '\r\n')
self.assertMultiLineEqual(
cssbeautifier.beautify(input, self.options), expectation)
if input.find('\n') != -1:
input = input.replace('\n', '\r\n')
self.assertMultiLineEqual(
cssbeautifier.beautify(input, self.options), expectation)
# Ensure support for auto eol detection
self.options.eol = 'auto'
self.assertMultiLineEqual(
cssbeautifier.beautify(input, self.options), expectation)
self.options.eol = '\n'
 
if __name__ == '__main__':
unittest.main()
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/css/tests.js
@@ -0,0 +1,445 @@
/*
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
 
exports.test_data = {
default_options: [
{ name: "indent_size", value: "1" },
{ name: "indent_char", value: "'\\t'" },
{ name: "selector_separator_newline", value: "true" },
{ name: "end_with_newline", value: "false" },
{ name: "newline_between_rules", value: "false" },
{ name: "space_around_combinator", value: "false" },
{ name: "preserve_newlines", value: "false" },
// deprecated
{ name: "space_around_selector_separator", value: "false" }
],
groups: [{
name: "End With Newline",
description: "",
matrix: [{
options: [
{ name: "end_with_newline", value: "true" }
],
eof: '\\n'
}, {
options: [
{ name: "end_with_newline", value: "false" }
],
eof: ''
}],
tests: [
{ fragment: true, input: '', output: '{{eof}}' },
{ fragment: true, input: ' .tabs{}', output: ' .tabs {}{{eof}}' },
{ fragment: true, input: ' \n\n.tabs{}\n\n\n\n', output: ' .tabs {}{{eof}}' },
{ fragment: true, input: '\n', output: '{{eof}}' }
],
}, {
name: "Empty braces",
description: "",
tests: [
{ input: '.tabs{}', output: '.tabs {}' },
{ input: '.tabs { }', output: '.tabs {}' },
{ input: '.tabs { }', output: '.tabs {}' },
// When we support preserving newlines this will need to change
{ input: '.tabs \n{\n \n }', output: '.tabs {}' }
],
}, {
name: "",
description: "",
tests: [{
input: '#cboxOverlay {\n\tbackground: url(images/overlay.png) repeat 0 0;\n\topacity: 0.9;\n\tfilter: alpha(opacity = 90);\n}',
output: '#cboxOverlay {\n\tbackground: url(images/overlay.png) repeat 0 0;\n\topacity: 0.9;\n\tfilter: alpha(opacity=90);\n}'
}, ],
}, {
name: "Support simple language specific option inheritance/overriding",
description: "Support simple language specific option inheritance/overriding",
matrix: [{
options: [
{ name: "indent_char", value: "' '" },
{ name: "indent_size", value: "4" },
{ name: "js", value: "{ 'indent_size': 3 }" },
{ name: "css", value: "{ 'indent_size': 5 }" }
],
c: ' ',
},
{
options: [
{ name: "indent_char", value: "' '" },
{ name: "indent_size", value: "4" },
{ name: "html", value: "{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 } }" }
],
c: ' '
},
{
options: [
{ name: "indent_char", value: "' '" },
{ name: "indent_size", value: "9" },
{ name: "html", value: "{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 8 }, 'indent_size': 2}" },
{ name: "js", value: "{ 'indent_size': 5 }" },
{ name: "css", value: "{ 'indent_size': 3 }" }
],
c: ' '
}
],
tests: [{
unchanged: [
'.selector {',
'{{c}}font-size: 12px;',
'}'
]
}]
}, {
name: "Space Around Combinator",
description: "",
matrix: [{
options: [{ name: "space_around_combinator", value: "true" }],
space: ' '
}, {
options: [{ name: "space_around_combinator", value: "false" }],
space: ''
}, {
// space_around_selector_separator is deprecated, but needs to keep working for now.
options: [{ name: "space_around_selector_separator", value: "true" }],
space: ' '
}],
tests: [
{ input: 'a>b{}', output: 'a{{space}}>{{space}}b {}' },
{ input: 'a~b{}', output: 'a{{space}}~{{space}}b {}' },
{ input: 'a+b{}', output: 'a{{space}}+{{space}}b {}' },
{ input: 'a+b>c{}', output: 'a{{space}}+{{space}}b{{space}}>{{space}}c {}' },
{ input: 'a > b{}', output: 'a{{space}}>{{space}}b {}' },
{ input: 'a ~ b{}', output: 'a{{space}}~{{space}}b {}' },
{ input: 'a + b{}', output: 'a{{space}}+{{space}}b {}' },
{ input: 'a + b > c{}', output: 'a{{space}}+{{space}}b{{space}}>{{space}}c {}' },
{
input: 'a > b{width: calc(100% + 45px);}',
output: [
'a{{space}}>{{space}}b {',
'\twidth: calc(100% + 45px);',
'}'
]
},
{
input: 'a ~ b{width: calc(100% + 45px);}',
output: [
'a{{space}}~{{space}}b {',
'\twidth: calc(100% + 45px);',
'}'
]
},
{
input: 'a + b{width: calc(100% + 45px);}',
output: [
'a{{space}}+{{space}}b {',
'\twidth: calc(100% + 45px);',
'}'
]
},
{
input: 'a + b > c{width: calc(100% + 45px);}',
output: [
'a{{space}}+{{space}}b{{space}}>{{space}}c {',
'\twidth: calc(100% + 45px);',
'}'
]
}
]
}, {
name: 'Selector Separator',
description: '',
matrix: [{
options: [
{ name: 'selector_separator_newline', value: 'false' },
{ name: 'selector_separator', value: '" "' }
],
separator: ' ',
separator1: ' '
}, {
options: [
{ name: 'selector_separator_newline', value: 'false' },
{ name: 'selector_separator', value: '" "' }
],
// BUG: #713
separator: ' ',
separator1: ' '
}, {
options: [
{ name: 'selector_separator_newline', value: 'true' },
{ name: 'selector_separator', value: '" "' }
],
separator: '\\n',
separator1: '\\n\\t'
}, {
options: [
{ name: 'selector_separator_newline', value: 'true' },
{ name: 'selector_separator', value: '" "' }
],
separator: '\\n',
separator1: '\\n\\t'
}],
tests: [
{ input: '#bla, #foo{color:green}', output: '#bla,{{separator}}#foo {\n\tcolor: green\n}' },
{ input: '@media print {.tab{}}', output: '@media print {\n\t.tab {}\n}' },
{ input: '@media print {.tab,.bat{}}', output: '@media print {\n\t.tab,{{separator1}}.bat {}\n}' },
{ input: '#bla, #foo{color:black}', output: '#bla,{{separator}}#foo {\n\tcolor: black\n}' }, {
input: 'a:first-child,a:first-child{color:red;div:first-child,div:hover{color:black;}}',
output: 'a:first-child,{{separator}}a:first-child {\n\tcolor: red;\n\tdiv:first-child,{{separator1}}div:hover {\n\t\tcolor: black;\n\t}\n}'
}
]
}, {
name: "Preserve Newlines",
description: "",
matrix: [{
options: [
{ name: "preserve_newlines", value: "true" }
],
separator_input: '\\n\\n',
separator_output: '\\n\\n',
}, {
options: [
{ name: "preserve_newlines", value: "false" }
],
separator_input: '\\n\\n',
separator_output: '\\n',
}],
tests: [
{ input: '.div {}{{separator_input}}.span {}', output: '.div {}{{separator_output}}.span {}' },
{ input: '#bla, #foo{\n\tcolor:black;{{separator_input}}\tfont-size: 12px;\n}', output: '#bla,\n#foo {\n\tcolor: black;{{separator_output}}\tfont-size: 12px;\n}' }
],
},
{
name: "Preserve Newlines and newline_between_rules",
description: "",
options: [
{ name: "preserve_newlines", value: "true" },
{ name: "newline_between_rules", value: "true" }
],
tests: [
{ input: '.div {}.span {}', output: '.div {}\n\n.span {}' },
{ input: '#bla, #foo{\n\tcolor:black;\n\tfont-size: 12px;\n}', output: '#bla,\n#foo {\n\tcolor: black;\n\tfont-size: 12px;\n}' },
{ input: '#bla, #foo{\n\tcolor:black;\n\n\n\tfont-size: 12px;\n}', output: '#bla,\n#foo {\n\tcolor: black;\n\n\n\tfont-size: 12px;\n}' },
{ unchanged: '#bla,\n\n#foo {\n\tcolor: black;\n\tfont-size: 12px;\n}' },
{ unchanged: 'a {\n\tb: c;\n\n\n\td: {\n\t\te: f;\n\t}\n}' },
{ unchanged: '.div {}\n\n.span {}' },
{ unchanged: '.div {\n\ta: 1;\n\n\n\tb: 2;\n}\n\n\n\n.span {\n\ta: 1;\n}' },
{ unchanged: '.div {\n\n\n\ta: 1;\n\n\n\tb: 2;\n}\n\n\n\n.span {\n\ta: 1;\n}' },
{ unchanged: '@media screen {\n\t.div {\n\t\ta: 1;\n\n\n\t\tb: 2;\n\t}\n\n\n\n\t.span {\n\t\ta: 1;\n\t}\n}\n\n.div {}\n\n.span {}' },
],
}, {
name: "Preserve Newlines and add tabs",
options: [{ name: "preserve_newlines", value: "true" }],
description: "",
tests: [{
input: '.tool-tip {\n\tposition: relative;\n\n\t\t\n\t.tool-tip-content {\n\t\t&>* {\n\t\t\tmargin-top: 0;\n\t\t}\n\t\t\n\n\t\t.mixin-box-shadow(.2rem .2rem .5rem rgba(0, 0, 0, .15));\n\t\tpadding: 1rem;\n\t\tposition: absolute;\n\t\tz-index: 10;\n\t}\n}',
output: '.tool-tip {\n\tposition: relative;\n\n\n\t.tool-tip-content {\n\t\t&>* {\n\t\t\tmargin-top: 0;\n\t\t}\n\\n\\n\t\t.mixin-box-shadow(.2rem .2rem .5rem rgba(0, 0, 0, .15));\n\t\tpadding: 1rem;\n\t\tposition: absolute;\n\t\tz-index: 10;\n\t}\n}'
}],
}, {
name: "Newline Between Rules",
description: "",
matrix: [{
options: [
{ name: "newline_between_rules", value: "true" }
],
separator: '\\n'
}, {
options: [
{ name: "newline_between_rules", value: "false" }
],
separator: ''
}],
tests: [
{ input: '.div {}\n.span {}', output: '.div {}\n{{separator}}.span {}' },
{ input: '.div{}\n \n.span{}', output: '.div {}\n{{separator}}.span {}' },
{ input: '.div {} \n \n.span { } \n', output: '.div {}\n{{separator}}.span {}' },
{ input: '.div {\n \n} \n .span {\n } ', output: '.div {}\n{{separator}}.span {}' },
{ input: '.selector1 {\n\tmargin: 0; /* This is a comment including an url http://domain.com/path/to/file.ext */\n}\n.div{height:15px;}', output: '.selector1 {\n\tmargin: 0;\n\t/* This is a comment including an url http://domain.com/path/to/file.ext */\n}\n{{separator}}.div {\n\theight: 15px;\n}' },
{ input: '.tabs{width:10px;//end of line comment\nheight:10px;//another\n}\n.div{height:15px;}', output: '.tabs {\n\twidth: 10px; //end of line comment\n\theight: 10px; //another\n}\n{{separator}}.div {\n\theight: 15px;\n}' },
{ input: '#foo {\n\tbackground-image: url(foo@2x.png);\n\t@font-face {\n\t\tfont-family: "Bitstream Vera Serif Bold";\n\t\tsrc: url("http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf");\n\t}\n}\n.div{height:15px;}', output: '#foo {\n\tbackground-image: url(foo@2x.png);\n\t@font-face {\n\t\tfont-family: "Bitstream Vera Serif Bold";\n\t\tsrc: url("http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf");\n\t}\n}\n{{separator}}.div {\n\theight: 15px;\n}' },
{ input: '@media screen {\n\t#foo:hover {\n\t\tbackground-image: url(foo@2x.png);\n\t}\n\t@font-face {\n\t\tfont-family: "Bitstream Vera Serif Bold";\n\t\tsrc: url("http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf");\n\t}\n}\n.div{height:15px;}', output: '@media screen {\n\t#foo:hover {\n\t\tbackground-image: url(foo@2x.png);\n\t}\n\t@font-face {\n\t\tfont-family: "Bitstream Vera Serif Bold";\n\t\tsrc: url("http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf");\n\t}\n}\n{{separator}}.div {\n\theight: 15px;\n}' },
{ input: '@font-face {\n\tfont-family: "Bitstream Vera Serif Bold";\n\tsrc: url("http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf");\n}\n@media screen {\n\t#foo:hover {\n\t\tbackground-image: url(foo.png);\n\t}\n\t@media screen and (min-device-pixel-ratio: 2) {\n\t\t@font-face {\n\t\t\tfont-family: "Helvetica Neue"\n\t\t}\n\t\t#foo:hover {\n\t\t\tbackground-image: url(foo@2x.png);\n\t\t}\n\t}\n}', output: '@font-face {\n\tfont-family: "Bitstream Vera Serif Bold";\n\tsrc: url("http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf");\n}\n{{separator}}@media screen {\n\t#foo:hover {\n\t\tbackground-image: url(foo.png);\n\t}\n\t@media screen and (min-device-pixel-ratio: 2) {\n\t\t@font-face {\n\t\t\tfont-family: "Helvetica Neue"\n\t\t}\n\t\t#foo:hover {\n\t\t\tbackground-image: url(foo@2x.png);\n\t\t}\n\t}\n}' },
{ input: 'a:first-child{color:red;div:first-child{color:black;}}\n.div{height:15px;}', output: 'a:first-child {\n\tcolor: red;\n\tdiv:first-child {\n\t\tcolor: black;\n\t}\n}\n{{separator}}.div {\n\theight: 15px;\n}' },
{ input: 'a:first-child{color:red;div:not(.peq){color:black;}}\n.div{height:15px;}', output: 'a:first-child {\n\tcolor: red;\n\tdiv:not(.peq) {\n\t\tcolor: black;\n\t}\n}\n{{separator}}.div {\n\theight: 15px;\n}' },
],
}, {
name: "Functions braces",
description: "",
tests: [
{ input: '.tabs(){}', output: '.tabs() {}' },
{ input: '.tabs (){}', output: '.tabs () {}' },
{ input: '.tabs (pa, pa(1,2)), .cols { }', output: '.tabs (pa, pa(1, 2)),\n.cols {}' },
{ input: '.tabs(pa, pa(1,2)), .cols { }', output: '.tabs(pa, pa(1, 2)),\n.cols {}' },
{ input: '.tabs ( ) { }', output: '.tabs () {}' },
{ input: '.tabs( ) { }', output: '.tabs() {}' },
{ input: '.tabs (t, t2) \n{\n key: val(p1 ,p2); \n }', output: '.tabs (t, t2) {\n\tkey: val(p1, p2);\n}' },
{ unchanged: '.box-shadow(@shadow: 0 1px 3px rgba(0, 0, 0, .25)) {\n\t-webkit-box-shadow: @shadow;\n\t-moz-box-shadow: @shadow;\n\tbox-shadow: @shadow;\n}' }
],
}, {
name: "Comments",
description: "",
tests: [
{ unchanged: '/* test */' },
{ input: '.tabs{/* test */}', output: '.tabs {\n\t/* test */\n}' },
{ input: '.tabs{/* test */}', output: '.tabs {\n\t/* test */\n}' },
{ input: '/* header */.tabs {}', output: '/* header */\n\n.tabs {}' },
{ input: '.tabs {\n/* non-header */\nwidth:10px;}', output: '.tabs {\n\t/* non-header */\n\twidth: 10px;\n}' },
{ unchanged: '/* header' },
{ unchanged: '// comment' }, {
input: '.selector1 {\n\tmargin: 0; /* This is a comment including an url http://domain.com/path/to/file.ext */\n}',
output: '.selector1 {\n\tmargin: 0;\n\t/* This is a comment including an url http://domain.com/path/to/file.ext */\n}'
},
 
{
comment: "single line comment support (less/sass)",
input: '.tabs{\n// comment\nwidth:10px;\n}',
output: '.tabs {\n\t// comment\n\twidth: 10px;\n}'
},
{ input: '.tabs{// comment\nwidth:10px;\n}', output: '.tabs {\n\t// comment\n\twidth: 10px;\n}' },
{ input: '//comment\n.tabs{width:10px;}', output: '//comment\n.tabs {\n\twidth: 10px;\n}' },
{ input: '.tabs{//comment\n//2nd single line comment\nwidth:10px;}', output: '.tabs {\n\t//comment\n\t//2nd single line comment\n\twidth: 10px;\n}' },
{ input: '.tabs{width:10px;//end of line comment\n}', output: '.tabs {\n\twidth: 10px; //end of line comment\n}' },
{ input: '.tabs{width:10px;//end of line comment\nheight:10px;}', output: '.tabs {\n\twidth: 10px; //end of line comment\n\theight: 10px;\n}' },
{ input: '.tabs{width:10px;//end of line comment\nheight:10px;//another\n}', output: '.tabs {\n\twidth: 10px; //end of line comment\n\theight: 10px; //another\n}' }
],
}, {
name: "Handle LESS property name interpolation",
description: "",
tests: [
{ unchanged: 'tag {\n\t@{prop}: none;\n}' },
{ input: 'tag{@{prop}:none;}', output: 'tag {\n\t@{prop}: none;\n}' },
{ input: 'tag{ @{prop}: none;}', output: 'tag {\n\t@{prop}: none;\n}' },
{
comment: "can also be part of property name",
unchanged: 'tag {\n\tdynamic-@{prop}: none;\n}'
},
{ input: 'tag{dynamic-@{prop}:none;}', output: 'tag {\n\tdynamic-@{prop}: none;\n}' },
{ input: 'tag{ dynamic-@{prop}: none;}', output: 'tag {\n\tdynamic-@{prop}: none;\n}' },
],
}, {
name: "Handle LESS property name interpolation, test #631",
description: "",
tests: [
{ unchanged: '.generate-columns(@n, @i: 1) when (@i =< @n) {\n\t.column-@{i} {\n\t\twidth: (@i * 100% / @n);\n\t}\n\t.generate-columns(@n, (@i + 1));\n}' },
{
input: '.generate-columns(@n,@i:1) when (@i =< @n){.column-@{i}{width:(@i * 100% / @n);}.generate-columns(@n,(@i + 1));}',
output: '.generate-columns(@n, @i: 1) when (@i =< @n) {\n\t.column-@{i} {\n\t\twidth: (@i * 100% / @n);\n\t}\n\t.generate-columns(@n, (@i + 1));\n}'
}
],
}, {
name: "Psuedo-classes vs Variables",
description: "",
tests: [
{ unchanged: '@page :first {}' }, {
comment: "Assume the colon goes with the @name. If we're in LESS, this is required regardless of the at-string.",
input: '@page:first {}',
output: '@page: first {}'
},
{ unchanged: '@page: first {}' }
],
}, {
name: "SASS/SCSS",
description: "",
tests: [{
comment: "Basic Interpolation",
unchanged: 'p {\n\t$font-size: 12px;\n\t$line-height: 30px;\n\tfont: #{$font-size}/#{$line-height};\n}'
},
{ unchanged: 'p.#{$name} {}' }, {
unchanged: [
'@mixin itemPropertiesCoverItem($items, $margin) {',
'\twidth: calc((100% - ((#{$items} - 1) * #{$margin}rem)) / #{$items});',
'\tmargin: 1.6rem #{$margin}rem 1.6rem 0;',
'}'
]
},
{
comment: "Multiple filed issues in LESS due to not(:blah)",
unchanged: '&:first-of-type:not(:last-child) {}'
},
{
unchanged: [
'div {',
'\t&:not(:first-of-type) {',
'\t\tbackground: red;',
'\t}',
'}',
]
}
 
],
}, {
name: "Proper handling of colon in selectors",
description: "Space before a colon in a selector must be preserved, as it means pseudoclass/pseudoelement on any child",
options: [{ name: "selector_separator_newline", value: "false" }],
tests: [
{ unchanged: 'a :b {}' },
{ unchanged: 'a ::b {}' },
{ unchanged: 'a:b {}' },
{ unchanged: 'a::b {}' },
{
input: 'a {}, a::b {}, a ::b {}, a:b {}, a :b {}',
output: 'a {}\n, a::b {}\n, a ::b {}\n, a:b {}\n, a :b {}'
},
{
unchanged: [
'.card-blue ::-webkit-input-placeholder {',
'\tcolor: #87D1FF;',
'}'
]
},
{
unchanged: [
'div [attr] :not(.class) {',
'\tcolor: red;',
'}'
]
}
]
}, {
name: "Regresssion Tests",
description: "General Regression tests for known issues",
options: [{ name: "selector_separator_newline", value: "false" }],
tests: [{
unchanged: [
'@media(min-width:768px) {',
'\t.selector::after {',
'\t\t/* property: value */',
'\t}',
'\t.other-selector {',
'\t\t/* property: value */',
'\t}',
'}'
]
}, {
unchanged: [
'.fa-rotate-270 {',
'\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);',
'}'
]
}]
}, {
 
}
]
};
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/html/node.mustache
@@ -0,0 +1,378 @@
/*
{{&header_text}}
 
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/*jshint unused:false */
 
function run_html_tests(test_obj, Urlencoded, js_beautify, html_beautify, css_beautify)
{
 
var default_opts = {
indent_size: 4,
indent_char: ' ',
preserve_newlines: true,
jslint_happy: false,
keep_array_indentation: false,
brace_style: 'collapse',
space_before_conditional: true,
break_chained_methods: false,
selector_separator: '\n',
end_with_newline: false
};
var opts;
 
{{#default_options}} default_opts.{{name}} = {{&value}};
{{/default_options}}
 
function reset_options()
{
opts = JSON.parse(JSON.stringify(default_opts));
}
 
function test_html_beautifier(input)
{
return html_beautify(input, opts);
}
 
var sanitytest;
 
// test the input on beautifier with the current flag settings
// does not check the indentation / surroundings as bt() does
function test_fragment(input, expected)
{
expected = expected || expected === '' ? expected : input;
sanitytest.expect(input, expected);
// if the expected is different from input, run it again
// expected output should be unchanged when run twice.
if (expected !== input) {
sanitytest.expect(expected, expected);
}
 
// Everywhere we do newlines, they should be replaced with opts.eol
opts.eol = '\r\n';
expected = expected.replace(/[\n]/g, '\r\n');
sanitytest.expect(input, expected);
if (input.indexOf('\n') !== -1) {
input = input.replace(/[\n]/g, '\r\n');
sanitytest.expect(input, expected);
// Ensure support for auto eol detection
opts.eol = 'auto';
sanitytest.expect(input, expected);
}
opts.eol = '\n';
}
 
// test html
function bth(input, expectation)
{
var wrapped_input, wrapped_expectation, field_input, field_expectation;
 
expectation = expectation || expectation === '' ? expectation : input;
sanitytest.test_function(test_html_beautifier, 'html_beautify');
test_fragment(input, expectation);
 
if (opts.indent_size === 4 && input) {
wrapped_input = '<div>\n' + input.replace(/^(.+)$/mg, ' $1') + '\n <span>inline</span>\n</div>';
wrapped_expectation = '<div>\n' + expectation.replace(/^(.+)$/mg, ' $1') + '\n <span>inline</span>\n</div>';
test_fragment(wrapped_input, wrapped_expectation);
}
}
 
function unicode_char(value) {
return String.fromCharCode(value);
}
 
function beautifier_tests()
{
sanitytest = test_obj;
 
reset_options();
//============================================================
bth('');
 
{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}
//============================================================
{{^matrix}}
// {{&name}}
reset_options();
{{#options}}
opts.{{name}} = {{&value}};
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}};
{{/tests}}
 
{{/matrix}}
{{#matrix}}
// {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})
reset_options();
{{#options}}
opts.{{name}} = {{&value}};
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}};
{{/tests}}
 
{{/matrix}}
{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}
}
 
function beautifier_unconverted_tests()
{
sanitytest = test_obj;
 
reset_options();
//============================================================
opts.end_with_newline = true;
test_fragment('', '\n');
test_fragment('<div></div>\n');
test_fragment('<div></div>\n\n\n', '<div></div>\n');
test_fragment('<head>\n' +
' <script>\n' +
' mocha.setup("bdd");\n' +
'\n' +
' </script>\n' +
'</head>\n');
 
 
opts.end_with_newline = false;
// error cases need love too
bth('<img title="Bad food!" src="foo.jpg" alt="Evil" ">');
bth("<!-- don't blow up if a comment is not complete"); // -->
 
test_fragment(
'<head>\n' +
' <script>\n' +
' mocha.setup("bdd");\n' +
' </script>\n' +
'</head>');
 
test_fragment('<div></div>\n', '<div></div>');
bth('<div></div>');
bth('<div>content</div>');
bth('<div><div></div></div>',
'<div>\n' +
' <div></div>\n' +
'</div>');
bth('<div><div>content</div></div>',
'<div>\n' +
' <div>content</div>\n' +
'</div>');
bth('<div>\n' +
' <span>content</span>\n' +
'</div>');
bth('<div>\n' +
'</div>');
bth('<div>\n' +
' content\n' +
'</div>');
bth('<div>\n' +
' </div>',
'<div>\n' +
'</div>');
bth(' <div>\n' +
' </div>',
'<div>\n' +
'</div>');
bth('<div>\n' +
'</div>\n' +
' <div>\n' +
' </div>',
'<div>\n' +
'</div>\n' +
'<div>\n' +
'</div>');
bth(' <div>\n' +
'</div>',
'<div>\n' +
'</div>');
bth('<div >content</div>',
'<div>content</div>');
bth('<div thinger="preserve space here" ></div >',
'<div thinger="preserve space here"></div>');
bth('content\n' +
' <div>\n' +
' </div>\n' +
'content',
'content\n' +
'<div>\n' +
'</div>\n' +
'content');
bth('<li>\n' +
' <div>\n' +
' </div>\n' +
'</li>');
bth('<li>\n' +
'<div>\n' +
'</div>\n' +
'</li>',
'<li>\n' +
' <div>\n' +
' </div>\n' +
'</li>');
bth('<li>\n' +
' content\n' +
'</li>\n' +
'<li>\n' +
' content\n' +
'</li>');
 
bth('<img>content');
bth('<img> content');
bth('<img> content', '<img> content');
 
bth('<img><img>content');
bth('<img> <img>content');
bth('<img> <img>content', '<img> <img>content');
 
bth('<img><b>content</b>');
bth('<img> <b>content</b>');
bth('<img> <b>content</b>', '<img> <b>content</b>');
 
bth('<div>content<img>content</div>');
bth('<div> content <img> content</div>');
bth('<div> content <img> content </div>',
'<div> content <img> content </div>');
bth('Text <a href="#">Link</a> Text');
 
var unformatted = opts.unformatted;
opts.unformatted = ['script', 'style'];
bth('<script id="javascriptTemplate" type="text/x-kendo-template">\n' +
' <ul>\n' +
' # for (var i = 0; i < data.length; i++) { #\n' +
' <li>#= data[i] #</li>\n' +
' # } #\n' +
' </ul>\n' +
'</script>');
bth('<style>\n' +
' body {background-color:lightgrey}\n' +
' h1 {color:blue}\n' +
'</style>');
opts.unformatted = unformatted;
 
unformatted = opts.unformatted;
opts.unformatted = ['custom-element'];
test_fragment('<div>should <custom-element>not</custom-element>' +
' insert newlines</div>',
'<div>should <custom-element>not</custom-element>' +
' insert newlines</div>');
opts.unformatted = unformatted;
 
// Tests that don't pass, but probably should.
// bth('<div><span>content</span></div>');
 
// Handlebars tests
// Without the indent option on, handlebars are treated as content.
 
opts.wrap_line_length = 0;
//...---------1---------2---------3---------4---------5---------6---------7
//...1234567890123456789012345678901234567890123456789012345678901234567890
bth('<div>Some text that should not wrap at all.</div>',
/* expected */
'<div>Some text that should not wrap at all.</div>');
 
// A value of 0 means no max line length, and should not wrap.
//...---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29
//...12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
bth('<div>Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all.</div>',
/* expected */
'<div>Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all.</div>');
 
opts.wrap_line_length = "0";
//...---------1---------2---------3---------4---------5---------6---------7
//...1234567890123456789012345678901234567890123456789012345678901234567890
bth('<div>Some text that should not wrap at all.</div>',
/* expected */
'<div>Some text that should not wrap at all.</div>');
 
// A value of "0" means no max line length, and should not wrap
//...---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29
//...12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
bth('<div>Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all.</div>',
/* expected */
'<div>Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all.</div>');
 
//BUGBUG: This should wrap before 40 not after.
opts.wrap_line_length = 40;
//...---------1---------2---------3---------4---------5---------6---------7
//...1234567890123456789012345678901234567890123456789012345678901234567890
bth('<div>Some test text that should wrap_inside_this section here.</div>',
/* expected */
'<div>Some test text that should wrap_inside_this\n' +
' section here.</div>');
 
opts.wrap_line_length = "40";
//...---------1---------2---------3---------4---------5---------6---------7
//...1234567890123456789012345678901234567890123456789012345678901234567890
bth('<div>Some test text that should wrap_inside_this section here.</div>',
/* expected */
'<div>Some test text that should wrap_inside_this\n' +
' section here.</div>');
 
opts.indent_size = 1;
opts.indent_char = '\t';
opts.preserve_newlines = false;
bth('<div>\n\tfoo\n</div>', '<div> foo </div>');
 
opts.preserve_newlines = true;
bth('<div>\n\tfoo\n</div>');
 
 
 
// test preserve_newlines and max_preserve_newlines
opts.preserve_newlines = false;
bth('<div>Should not</div>\n\n\n' +
'<div>preserve newlines</div>',
'<div>Should not</div>\n' +
'<div>preserve newlines</div>');
 
opts.preserve_newlines = true;
opts.max_preserve_newlines = 0;
bth('<div>Should</div>\n\n\n' +
'<div>preserve zero newlines</div>',
'<div>Should</div>\n' +
'<div>preserve zero newlines</div>');
 
opts.max_preserve_newlines = 1;
bth('<div>Should</div>\n\n\n' +
'<div>preserve one newline</div>',
'<div>Should</div>\n\n' +
'<div>preserve one newline</div>');
 
opts.max_preserve_newlines = null;
bth('<div>Should</div>\n\n\n' +
'<div>preserve one newline</div>',
'<div>Should</div>\n\n\n' +
'<div>preserve one newline</div>');
}
 
beautifier_tests();
beautifier_unconverted_tests();
}
 
if (typeof exports !== "undefined") {
exports.run_html_tests = run_html_tests;
}
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/html/tests.js
@@ -0,0 +1,1105 @@
/*
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
 
exports.test_data = {
default_options: [
{ name: "indent_size", value: "4" },
{ name: "indent_char", value: "' '" },
{ name: "indent_with_tabs", value: "false" },
{ name: "preserve_newlines", value: "true" },
{ name: "jslint_happy", value: "false" },
{ name: "keep_array_indentation", value: "false" },
{ name: "brace_style", value: "'collapse'" },
{ name: "extra_liners", value: "['html', 'head', '/html']" }
],
groups: [{
name: "Handle inline and block elements differently",
description: "",
matrix: [{}],
tests: [{
fragment: true,
input: '<body><h1>Block</h1></body>',
output: [
'<body>',
' <h1>Block</h1>',
'</body>'
]
}, {
fragment: true,
unchanged: '<body><i>Inline</i></body>'
}]
}, {
name: "End With Newline",
description: "",
matrix: [{
options: [
{ name: "end_with_newline", value: "true" }
],
eof: '\n'
}, {
options: [
{ name: "end_with_newline", value: "false" }
],
eof: ''
}
 
],
tests: [
{ fragment: true, input: '', output: '{{eof}}' },
{ fragment: true, input: '<div></div>', output: '<div></div>{{eof}}' },
// { fragment: true, input: ' \n\n<div></div>\n\n\n\n', output: ' <div></div>{{eof}}' },
{ fragment: true, input: '\n', output: '{{eof}}' }
],
}, {
name: "Custom Extra Liners (empty)",
description: "",
matrix: [{
options: [
{ name: "extra_liners", value: "[]" }
]
},
 
],
tests: [{
fragment: true,
input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',
output: '<html>\n<head>\n <meta>\n</head>\n<body>\n <div>\n <p>x</p>\n </div>\n</body>\n</html>'
}],
}, {
name: "Custom Extra Liners (default)",
description: "",
matrix: [{
options: [
{ name: "extra_liners", value: "null" }
]
},
 
],
tests: [{
fragment: true,
input: '<html><head></head><body></body></html>',
output: '<html>\n\n<head></head>\n\n<body></body>\n\n</html>'
}],
}, {
name: "Custom Extra Liners (p, string)",
description: "",
matrix: [{
options: [
{ name: "extra_liners", value: "'p,/p'" }
]
},
 
],
tests: [{
fragment: true,
input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',
output: '<html>\n<head>\n <meta>\n</head>\n<body>\n <div>\n\n <p>x\n\n </p>\n </div>\n</body>\n</html>'
}],
}, {
name: "Custom Extra Liners (p)",
description: "",
matrix: [{
options: [
{ name: "extra_liners", value: "['p', '/p']" }
]
},
 
],
tests: [{
fragment: true,
input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',
output: '<html>\n<head>\n <meta>\n</head>\n<body>\n <div>\n\n <p>x\n\n </p>\n </div>\n</body>\n</html>'
}],
}, {
name: "Tests for script and style types (issue 453, 821)",
description: "Only format recognized script types",
tests: [{
input: '<script type="text/unknown"><div></div></script>',
output: [
'<script type="text/unknown">',
' <div></div>',
'</script>'
]
}, {
input: '<script type="text/javascript"><div></div></script>',
output: [
'<script type="text/javascript">',
' < div > < /div>',
'</script>'
]
}, {
input: '<script><div></div></script>',
output: [
'<script>',
' < div > < /div>',
'</script>'
]
}, {
input: '<script>var foo = "bar";</script>',
output: [
'<script>',
' var foo = "bar";',
'</script>'
]
}, {
input: '<script type="text/javascript">var foo = "bar";</script>',
output: [
'<script type="text/javascript">',
' var foo = "bar";',
'</script>'
]
}, {
input: '<script type="application/javascript">var foo = "bar";</script>',
output: [
'<script type="application/javascript">',
' var foo = "bar";',
'</script>'
]
}, {
input: '<script type="application/javascript;version=1.8">var foo = "bar";</script>',
output: [
'<script type="application/javascript;version=1.8">',
' var foo = "bar";',
'</script>'
]
}, {
input: '<script type="application/x-javascript">var foo = "bar";</script>',
output: [
'<script type="application/x-javascript">',
' var foo = "bar";',
'</script>'
]
}, {
input: '<script type="application/ecmascript">var foo = "bar";</script>',
output: [
'<script type="application/ecmascript">',
' var foo = "bar";',
'</script>'
]
}, {
input: '<script type="dojo/aspect">this.domNode.style.display="none";</script>',
output: [
'<script type="dojo/aspect">',
' this.domNode.style.display = "none";',
'</script>'
]
}, {
input: '<script type="dojo/method">this.domNode.style.display="none";</script>',
output: [
'<script type="dojo/method">',
' this.domNode.style.display = "none";',
'</script>'
]
}, {
input: '<script type="text/javascript1.5">var foo = "bar";</script>',
output: [
'<script type="text/javascript1.5">',
' var foo = "bar";',
'</script>'
]
}, {
input: '<script type="application/json">{"foo":"bar"}</script>',
output: [
'<script type="application/json">',
' {',
' "foo": "bar"',
' }',
'</script>'
]
}, {
input: '<script type="application/ld+json">{"foo":"bar"}</script>',
output: [
'<script type="application/ld+json">',
' {',
' "foo": "bar"',
' }',
'</script>'
]
}, {
input: '<style type="text/unknown"><tag></tag></style>',
output: [
'<style type="text/unknown">',
' <tag></tag>',
'</style>'
]
}, {
input: '<style type="text/css"><tag></tag></style>',
output: [
'<style type="text/css">',
' <tag></tag>',
'</style>'
]
}, {
input: '<style><tag></tag></style>',
output: [
'<style>',
' <tag></tag>',
'</style>'
]
}, {
input: '<style>.selector {font-size:12px;}</style>',
output: [
'<style>',
' .selector {',
' font-size: 12px;',
' }',
'</style>'
]
}, {
input: '<style type="text/css">.selector {font-size:12px;}</style>',
output: [
'<style type="text/css">',
' .selector {',
' font-size: 12px;',
' }',
'</style>'
]
},
 
],
}, {
name: "Attribute Wrap alignment with spaces",
description: "Ensure attributes are internally aligned with spaces when the indent_character is set to tab",
matrix: [{
options: [
{ name: "wrap_attributes", value: "'force-aligned'" },
{ name: "indent_with_tabs", value: "true" }
]
}],
tests: [{
fragment: true,
input: '<div><div a="1" b="2"><div>test</div></div></div>',
output: '<div>\n\t<div a="1"\n\t b="2">\n\t\t<div>test</div>\n\t</div>\n</div>'
}]
}, {
name: "Attribute Wrap de-indent",
description: "Tags de-indent when attributes are wrapped",
matrix: [{
options: [
{ name: "wrap_attributes", value: "'force-aligned'" },
{ name: "indent_with_tabs", value: "false" }
]
}],
tests: [{
fragment: true,
input: '<div a="1" b="2"><div>test</div></div>',
output: '<div a="1"\n b="2">\n <div>test</div>\n</div>'
},
{
fragment: true,
input: '<p>\n <a href="/test/" target="_blank"><img src="test.jpg" /></a><a href="/test/" target="_blank"><img src="test.jpg" /></a>\n</p>',
output: '<p>\n <a href="/test/"\n target="_blank"><img src="test.jpg" /></a><a href="/test/"\n target="_blank"><img src="test.jpg" /></a>\n</p>'
},
{
fragment: true,
input: '<p>\n <span data-not-a-href="/test/" data-totally-not-a-target="_blank"><img src="test.jpg" /></span><span data-not-a-href="/test/" data-totally-not-a-target="_blank"><img src="test.jpg" /></span>\n</p>',
output: '<p>\n <span data-not-a-href="/test/"\n data-totally-not-a-target="_blank"><img src="test.jpg" /></span><span data-not-a-href="/test/"\n data-totally-not-a-target="_blank"><img src="test.jpg" /></span>\n</p>'
}
]
}, {
name: "Attribute Wrap",
description: "Wraps attributes inside of html tags",
matrix: [{
options: [
{ name: "wrap_attributes", value: "'force'" }
],
indent_attr: '\n ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'force'" },
{ name: "wrap_line_length", value: "80" }
],
indent_attr: '\n ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'force'" },
{ name: "wrap_attributes_indent_size", value: "8" }
],
indent_attr: '\n ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'auto'" },
{ name: "wrap_line_length", value: "80" },
{ name: "wrap_attributes_indent_size", value: "0" }
],
indent_attr: ' ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: '\n'
}, {
options: [
{ name: "wrap_attributes", value: "'auto'" },
{ name: "wrap_line_length", value: "80" },
{ name: "wrap_attributes_indent_size", value: "4" }
],
indent_attr: ' ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'auto'" },
{ name: "wrap_line_length", value: "0" }
],
indent_attr: ' ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: ' '
}, {
options: [
{ name: "wrap_attributes", value: "'force-aligned'" }
],
indent_attr: '\n ',
indent_attr_faligned: ' ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'force-aligned'" },
{ name: "wrap_line_length", value: "80" }
],
indent_attr: '\n ',
indent_attr_faligned: ' ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'force-aligned'" },
{ name: "wrap_attributes_indent_size", value: "8" }
],
indent_attr: '\n ',
indent_attr_faligned: ' ',
indent_attr_first: ' ',
indent_end: '',
indent_end_selfclosing: ' ',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'force-expand-multiline'" },
{ name: "wrap_attributes_indent_size", value: "4" }
],
indent_attr: '\n ',
indent_attr_first: '\n ',
indent_end: '\n',
indent_end_selfclosing: '\n',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'force-expand-multiline'" },
{ name: "wrap_attributes_indent_size", value: "4" },
{ name: "wrap_line_length", value: "80" }
],
indent_attr: '\n ',
indent_attr_first: '\n ',
indent_end: '\n',
indent_end_selfclosing: '\n',
indent_over80: '\n '
}, {
options: [
{ name: "wrap_attributes", value: "'force-expand-multiline'" },
{ name: "wrap_attributes_indent_size", value: "8" }
],
indent_attr: '\n ',
indent_attr_first: '\n ',
indent_end: '\n',
indent_end_selfclosing: '\n',
indent_over80: '\n '
}],
tests: [{
fragment: true,
input: '<div >This is some text</div>',
output: '<div>This is some text</div>'
}, {
fragment: true,
input: '<div attr="123" >This is some text</div>',
output: '<div attr="123">This is some text</div>'
}, {
fragment: true,
input: '<div attr0 attr1="123" data-attr2="hello t here">This is some text</div>',
output: '<div{{indent_attr_first}}attr0{{indent_attr}}attr1="123"{{indent_attr}}data-attr2="hello t here"{{indent_end}}>This is some text</div>'
}, {
fragment: true,
input: '<div lookatthissuperduperlongattributenamewhoahcrazy0="true" attr0 attr1="123" data-attr2="hello t here" heymanimreallylongtoowhocomesupwiththesenames="false">This is some text</div>',
output: '<div{{indent_attr_first}}lookatthissuperduperlongattributenamewhoahcrazy0="true"{{indent_attr}}attr0{{indent_attr}}attr1="123"{{indent_attr}}data-attr2="hello t here"{{indent_over80}}heymanimreallylongtoowhocomesupwiththesenames="false"{{indent_end}}>This is some text</div>'
}, {
fragment: true,
input: '<img attr0 attr1="123" data-attr2="hello t here"/>',
output: '<img{{indent_attr_first}}attr0{{indent_attr}}attr1="123"{{indent_attr}}data-attr2="hello t here"{{indent_end_selfclosing}}/>'
}, {
fragment: true,
input: '<?xml version="1.0" encoding="UTF-8" ?><root attr1="foo" attr2="bar"/>',
output: '<?xml version="1.0" encoding="UTF-8" ?>\n<root{{indent_attr_first}}attr1="foo"{{indent_attr}}{{indent_attr_faligned}}attr2="bar"{{indent_end_selfclosing}}/>'
}, {
fragment: true,
input: '<link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,600,700,300&amp;subset=latin" rel="stylesheet" type="text/css">',
output: '<link{{indent_attr_first}}href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,600,700,300&amp;subset=latin"{{indent_over80}}{{indent_attr_faligned}}rel="stylesheet"{{indent_attr}}{{indent_attr_faligned}}type="text/css"{{indent_end}}>'
}]
}, {
name: "Handlebars Indenting Off",
description: "Test handlebar behavior when indenting is off",
template: "^^^ $$$",
options: [
{ name: "indent_handlebars", value: "false" }
],
tests: [{
fragment: true,
input_: '{{#if 0}}\n' +
' <div>\n' +
' </div>\n' +
'{{/if}}',
output: '{{#if 0}}\n' +
'<div>\n' +
'</div>\n' +
'{{/if}}'
}, {
fragment: true,
input_: '<div>\n' +
'{{#each thing}}\n' +
' {{name}}\n' +
'{{/each}}\n' +
'</div>',
output: '<div>\n' +
' {{#each thing}} {{name}} {{/each}}\n' +
'</div>'
}
 
]
}, {
name: "Handlebars Indenting On",
description: "Test handlebar formatting",
template: "^^^ $$$",
matrix: [{
options: [
{ name: "indent_handlebars", value: "true" }
],
content: '{{field}}'
}, {
options: [
{ name: "indent_handlebars", value: "true" }
],
content: '{{! comment}}'
}, {
options: [
{ name: "indent_handlebars", value: "true" }
],
content: '{{!-- comment--}}'
}, {
options: [
{ name: "indent_handlebars", value: "true" }
],
content: '{pre{{field1}} {{field2}} {{field3}}post'
}, {
options: [
{ name: "indent_handlebars", value: "true" }
],
content: '{{! \n mult-line\ncomment \n with spacing\n}}'
}, {
options: [
{ name: "indent_handlebars", value: "true" }
],
content: '{{!-- \n mult-line\ncomment \n with spacing\n--}}'
}, {
options: [
{ name: "indent_handlebars", value: "true" }
],
content: '{{!-- \n mult-line\ncomment \n{{#> component}}\n mult-line\ncomment \n with spacing\n {{/ component}}--}}'
}, {
options: [
{ name: "indent_handlebars", value: "true" },
{ name: "wrap_line_length", value: "80" }
],
content: 'content'
}],
tests: [
{ fragment: true, unchanged: '{{page-title}}' },
{ fragment: true, unchanged: '{{#if 0}}{{/if}}' },
{ fragment: true, unchanged: '{{#if 0}}^^^&content$$${{/if}}' },
{ fragment: true, unchanged: '{{#if 0}}\n{{/if}}' }, {
fragment: true,
input_: '{{#if words}}{{/if}}',
output: '{{#if words}}{{/if}}'
}, {
fragment: true,
input_: '{{#if words}}^^^&content$$${{/if}}',
output: '{{#if words}}^^^&content$$${{/if}}'
}, {
fragment: true,
input_: '{{#if words}}^^^&content$$${{/if}}',
output: '{{#if words}}^^^&content$$${{/if}}'
}, {
fragment: true,
unchanged: '{{#if 1}}\n' +
' <div>\n' +
' </div>\n' +
'{{/if}}'
}, {
fragment: true,
input_: '{{#if 1}}\n' +
'<div>\n' +
'</div>\n' +
'{{/if}}',
output: '{{#if 1}}\n' +
' <div>\n' +
' </div>\n' +
'{{/if}}'
}, {
fragment: true,
unchanged: '<div>\n' +
' {{#if 1}}\n' +
' {{/if}}\n' +
'</div>'
}, {
fragment: true,
input_: '<div>\n' +
'{{#if 1}}\n' +
'{{/if}}\n' +
'</div>',
output: '<div>\n' +
' {{#if 1}}\n' +
' {{/if}}\n' +
'</div>'
}, {
fragment: true,
input_: '{{#if}}\n' +
'{{#each}}\n' +
'{{#if}}\n' +
'^^^&content$$$\n' +
'{{/if}}\n' +
'{{#if}}\n' +
'^^^&content$$$\n' +
'{{/if}}\n' +
'{{/each}}\n' +
'{{/if}}',
output: '{{#if}}\n' +
' {{#each}}\n' +
' {{#if}}\n' +
' ^^^&content$$$\n' +
' {{/if}}\n' +
' {{#if}}\n' +
' ^^^&content$$$\n' +
' {{/if}}\n' +
' {{/each}}\n' +
'{{/if}}'
}, {
fragment: true,
unchanged: '{{#if 1}}\n' +
' <div>\n' +
' </div>\n' +
'{{/if}}'
},
 
// Test {{else}} aligned with {{#if}} and {{/if}}
{
fragment: true,
input_: '{{#if 1}}\n' +
' ^^^&content$$$\n' +
' {{else}}\n' +
' ^^^&content$$$\n' +
'{{/if}}',
output: '{{#if 1}}\n' +
' ^^^&content$$$\n' +
'{{else}}\n' +
' ^^^&content$$$\n' +
'{{/if}}'
}, {
fragment: true,
input_: '{{#if 1}}\n' +
' {{else}}\n' +
' {{/if}}',
output: '{{#if 1}}\n' +
'{{else}}\n' +
'{{/if}}'
}, {
fragment: true,
input_: '{{#if thing}}\n' +
'{{#if otherthing}}\n' +
' ^^^&content$$$\n' +
' {{else}}\n' +
'^^^&content$$$\n' +
' {{/if}}\n' +
' {{else}}\n' +
'^^^&content$$$\n' +
'{{/if}}',
output: '{{#if thing}}\n' +
' {{#if otherthing}}\n' +
' ^^^&content$$$\n' +
' {{else}}\n' +
' ^^^&content$$$\n' +
' {{/if}}\n' +
'{{else}}\n' +
' ^^^&content$$$\n' +
'{{/if}}'
},
// Test {{}} inside of <> tags, which should be separated by spaces
// for readability, unless they are inside a string.
{
fragment: true,
input_: '<div{{somestyle}}></div>',
output: '<div {{somestyle}}></div>'
}, {
fragment: true,
input_: '<div{{#if test}}class="foo"{{/if}}>^^^&content$$$</div>',
output: '<div {{#if test}} class="foo" {{/if}}>^^^&content$$$</div>'
}, {
fragment: true,
input_: '<div{{#if thing}}{{somestyle}}class="{{class}}"{{else}}class="{{class2}}"{{/if}}>^^^&content$$$</div>',
output: '<div {{#if thing}} {{somestyle}} class="{{class}}" {{else}} class="{{class2}}" {{/if}}>^^^&content$$$</div>'
}, {
fragment: true,
input_: '<span{{#if condition}}class="foo"{{/if}}>^^^&content$$$</span>',
output: '<span {{#if condition}} class="foo" {{/if}}>^^^&content$$$</span>'
}, {
fragment: true,
unchanged: '<div unformatted="{{#if}}^^^&content$$${{/if}}">^^^&content$$$</div>'
}, {
fragment: true,
unchanged: '<div unformatted="{{#if }} ^^^&content$$${{/if}}">^^^&content$$$</div>'
},
 
// Quotes found inside of Handlebars expressions inside of quoted
// strings themselves should not be considered string delimiters.
{
fragment: true,
unchanged: '<div class="{{#if thingIs "value"}}^^^&content$$${{/if}}"></div>'
}, {
fragment: true,
unchanged: '<div class="{{#if thingIs \\\'value\\\'}}^^^&content$$${{/if}}"></div>'
}, {
fragment: true,
unchanged: '<div class=\\\'{{#if thingIs "value"}}^^^&content$$${{/if}}\\\'></div>'
}, {
fragment: true,
unchanged: '<div class=\\\'{{#if thingIs \\\'value\\\'}}^^^&content$$${{/if}}\\\'></div>'
}, {
fragment: true,
unchanged: '<span>{{condition < 0 ? "result1" : "result2"}}</span>'
}, {
fragment: true,
unchanged: '<span>{{condition1 && condition2 && condition3 && condition4 < 0 ? "resForTrue" : "resForFalse"}}</span>'
}
],
}, {
name: "Handlebars Else tag indenting",
description: "Handlebar Else tags should be newlined after formatted tags",
template: "^^^ $$$",
options: [
{ name: "indent_handlebars", value: "true" }
],
tests: [{
fragment: true,
input_: '{{#if test}}<div></div>{{else}}<div></div>{{/if}}',
output: '{{#if test}}\n' +
' <div></div>\n' +
'{{else}}\n' +
' <div></div>\n' +
'{{/if}}'
}, {
fragment: true,
unchanged: '{{#if test}}<span></span>{{else}}<span></span>{{/if}}'
}]
}, {
name: "Unclosed html elements",
description: "Unclosed elements should not indent",
options: [],
tests: [
{ fragment: true, unchanged: '<source>\n<source>' },
{ fragment: true, unchanged: '<br>\n<br>' },
{ fragment: true, unchanged: '<input>\n<input>' },
{ fragment: true, unchanged: '<meta>\n<meta>' },
{ fragment: true, unchanged: '<link>\n<link>' },
{ fragment: true, unchanged: '<colgroup>\n <col>\n <col>\n</colgroup>' }
]
}, {
name: "Unformatted tags",
description: "Unformatted tag behavior",
options: [],
tests: [{
fragment: true,
input: '<ol>\n <li>b<pre>c</pre></li>\n</ol>',
output: [
'<ol>',
' <li>b',
' <pre>c</pre>',
' </li>',
'</ol>'
]
},
{ fragment: true, unchanged: '<ol>\n <li>b<code>c</code></li>\n</ol>' },
{ fragment: true, unchanged: '<ul>\n <li>\n <span class="octicon octicon-person"></span>\n <a href="/contact/">Kontakt</a>\n </li>\n</ul>' },
{ fragment: true, unchanged: '<div class="searchform"><input type="text" value="" name="s" id="s" /><input type="submit" id="searchsubmit" value="Search" /></div>' },
{ fragment: true, unchanged: '<div class="searchform"><input type="text" value="" name="s" id="s"><input type="submit" id="searchsubmit" value="Search"></div>' },
{ fragment: true, unchanged: '<p>\n <a href="/test/"><img src="test.jpg" /></a>\n</p>' },
{ fragment: true, unchanged: '<p>\n <a href="/test/"><img src="test.jpg" /></a><a href="/test/"><img src="test.jpg" /></a>\n</p>' },
{ fragment: true, unchanged: '<p>\n <a href="/test/"><img src="test.jpg" /></a><a href="/test/"><img src="test.jpg" /></a><a href="/test/"><img src="test.jpg" /></a><a href="/test/"><img src="test.jpg" /></a>\n</p>' },
{ fragment: true, unchanged: '<p>\n <span>image: <img src="test.jpg" /></span><span>image: <img src="test.jpg" /></span>\n</p>' },
{ fragment: true, unchanged: '<p>\n <strong>image: <img src="test.jpg" /></strong><strong>image: <img src="test.jpg" /></strong>\n</p>' },
]
}, {
name: "File starting with comment",
description: "Unformatted tag behavior",
options: [],
tests: [{
fragment: true,
unchanged: [
'<!--sample comment -->',
'',
'<html>',
'<body>',
' <span>a span</span>',
'</body>',
'',
'</html>'
]
}, ]
}, {
name: "Php formatting",
description: "Php (<?php ... ?>) treated as comments.",
options: [],
tests: [{
fragment: true,
input: '<h1 class="content-page-header"><?=$view["name"]; ?></h1>',
output: '<h1 class="content-page-header">\n <?=$view["name"]; ?>\n</h1>',
}, {
fragment: true,
unchanged: [
'<?php',
'for($i = 1; $i <= 100; $i++;) {',
' #count to 100!',
' echo($i . "</br>");',
'}',
'?>'
]
}, {
fragment: true,
unchanged: [
'<?php ?>',
'<!DOCTYPE html>',
'',
'<html>',
'',
'<head></head>',
'',
'<body></body>',
'',
'</html>'
]
}]
}, {
name: "Support simple language specific option inheritance/overriding",
description: "Support simple language specific option inheritance/overriding",
matrix: [{
options: [
{ name: "js", value: "{ 'indent_size': 3 }" },
{ name: "css", value: "{ 'indent_size': 5 }" }
],
h: ' ',
c: ' ',
j: ' '
},
{
options: [
{ name: "html", value: "{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 } }" }
],
h: ' ',
c: ' ',
j: ' '
},
{
options: [
{ name: "indent_size", value: "9" },
{ name: "html", value: "{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 }, 'indent_size': 2}" },
{ name: "js", value: "{ 'indent_size': 5 }" },
{ name: "css", value: "{ 'indent_size': 3 }" }
],
h: ' ',
c: ' ',
j: ' '
}
],
tests: [{
fragment: true,
unchanged: [
'<head>',
'{{h}}<script>',
'{{h}}{{h}}if (a == b) {',
'{{h}}{{h}}{{j}}test();',
'{{h}}{{h}}}',
'{{h}}</script>',
'{{h}}<style>',
'{{h}}{{h}}.selector {',
'{{h}}{{h}}{{c}}font-size: 12px;',
'{{h}}{{h}}}',
'{{h}}</style>',
'</head>',
]
}, ]
}, {
name: "underscore.js formatting",
description: "underscore.js templates (<% ... %>) treated as comments.",
options: [],
tests: [{
fragment: true,
unchanged: [
'<div class="col-sm-9">',
' <textarea id="notes" class="form-control" rows="3">',
' <%= notes %>',
' </textarea>',
'</div>'
]
}, ]
}, {
name: "Indent with tabs",
description: "Use one tab instead of several spaces for indentation",
template: "^^^ $$$",
options: [
{ name: "indent_with_tabs", value: "true" }
],
tests: [{
fragment: true,
input_: '<div>\n' +
'<div>\n' +
'</div>\n' +
'</div>',
output: '<div>\n' +
'\t<div>\n' +
'\t</div>\n' +
'</div>'
}]
}, {
name: "Indent without tabs",
description: "Use several spaces for indentation",
template: "^^^ $$$",
options: [
{ name: "indent_with_tabs", value: "false" }
],
tests: [{
fragment: true,
input_: '<div>\n' +
'<div>\n' +
'</div>\n' +
'</div>',
output: '<div>\n' +
' <div>\n' +
' </div>\n' +
'</div>'
}]
}, {
name: "Indent body inner html by default",
description: "",
tests: [{
fragment: true,
input: '<html>\n<body>\n<div></div>\n</body>\n\n</html>',
output: '<html>\n<body>\n <div></div>\n</body>\n\n</html>'
}]
}, {
name: "indent_body_inner_html set to false prevents indent of body inner html",
description: "",
options: [
{ name: 'indent_body_inner_html', value: "false" }
],
tests: [{
fragment: true,
unchanged: '<html>\n<body>\n<div></div>\n</body>\n\n</html>'
}]
}, {
name: "Indent head inner html by default",
description: "",
tests: [{
fragment: true,
input: '<html>\n\n<head>\n<meta>\n</head>\n\n</html>',
output: '<html>\n\n<head>\n <meta>\n</head>\n\n</html>'
}]
}, {
name: "indent_head_inner_html set to false prevents indent of head inner html",
description: "",
options: [
{ name: 'indent_head_inner_html', value: "false" }
],
tests: [{
fragment: true,
unchanged: '<html>\n\n<head>\n<meta>\n</head>\n\n</html>'
}]
}, {
name: "content_unformatted to prevent formatting content",
description: "",
options: [
{ name: 'content_unformatted', value: "['script', 'style', 'p', 'span', 'br']" }
],
tests: [{
fragment: true,
input: '<html><body><h1>A</h1><script>if(1){f();}</script><style>.a{display:none;}</style></body></html>',
output: [
'<html>',
'<body>',
' <h1>A</h1>',
' <script>if(1){f();}</script>',
' <style>.a{display:none;}</style>',
'</body>',
'',
'</html>'
]
}, {
fragment: true,
input: '<div><p>Beautify me</p></div><p><p>But not me</p></p>',
output: [
'<div>',
' <p>Beautify me</p>',
'</div>',
'<p><p>But not me</p></p>'
]
}, {
fragment: true,
input: '<div><p\n class="beauty-me"\n>Beautify me</p></div><p><p\n class="iamalreadybeauty"\n>But not me</p></p>',
output: [
'<div>',
' <p class="beauty-me">Beautify me</p>',
'</div>',
'<p><p',
' class="iamalreadybeauty"',
'>But not me</p></p>'
]
}, {
fragment: true,
unchanged: '<div><span>blabla<div>something here</div></span></div>'
}, {
fragment: true,
unchanged: '<div><br /></div>'
}, {
fragment: true,
input: '<div><pre>var a=1;\nvar b=a;</pre></div>',
output: [
'<div>',
' <pre>var a=1; var b=a;</pre>',
'</div>'
]
}, {
fragment: true,
input: '<div><pre>\nvar a=1;\nvar b=a;\n</pre></div>',
output: [
'<div>',
' <pre>',
' var a=1; var b=a;',
' </pre>',
'</div>'
]
}]
}, {
name: "default content_unformatted",
description: "",
options: [],
tests: [{
fragment: true,
input: '<html><body><h1>A</h1><script>if(1){f();}</script><style>.a{display:none;}</style></body></html>',
output: [
'<html>',
'<body>',
' <h1>A</h1>',
' <script>',
' if (1) {',
' f();',
' }',
' </script>',
' <style>',
' .a {',
' display: none;',
' }',
' </style>',
'</body>',
'',
'</html>'
]
}, {
fragment: true,
input: '<div><p>Beautify me</p></div><p><p>But not me</p></p>',
output: [
'<div>',
' <p>Beautify me</p>',
'</div>',
'<p>',
' <p>But not me</p>',
'</p>',
]
}, {
fragment: true,
input: '<div><p\n class="beauty-me"\n>Beautify me</p></div><p><p\n class="iamalreadybeauty"\n>But not me</p></p>',
output: [
'<div>',
' <p class="beauty-me">Beautify me</p>',
'</div>',
'<p>',
' <p class="iamalreadybeauty">But not me</p>',
'</p>'
]
}, {
fragment: true,
unchanged: '<div><span>blabla<div>something here</div></span></div>'
}, {
fragment: true,
unchanged: '<div><br /></div>'
}, {
fragment: true,
input: '<div><pre>var a=1;\nvar b=a;</pre></div>',
output: [
'<div>',
' <pre>var a=1;',
'var b=a;</pre>',
'</div>'
]
}, {
fragment: true,
input: '<div><pre>\nvar a=1;\nvar b=a;\n</pre></div>',
output: [
'<div>',
' <pre>',
'var a=1;',
'var b=a;',
'</pre>',
'</div>'
]
}]
}, {
name: "New Test Suite"
}],
};
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/javascript/inputlib.js
@@ -0,0 +1,84 @@
//--------//
// Inputs //
//--------//
 
var operator_position = {
sanity: [
'var res = a + b - c / d * e % f;',
'var res = g & h | i ^ j;',
'var res = (k && l || m) ? n : o;',
'var res = p >> q << r >>> s;',
'var res = t === u !== v != w == x >= y <= z > aa < ab;',
'ac + -ad'
],
comprehensive: [
'var res = a + b',
'- c /',
'd * e',
'%',
'f;',
' var res = g & h',
'| i ^',
'j;',
'var res = (k &&',
'l',
'|| m) ?',
'n',
': o',
';',
'var res = p',
'>> q <<',
'r',
'>>> s;',
'var res',
' = t',
'',
' === u !== v',
' !=',
'w',
'== x >=',
'y <= z > aa <',
'ab;',
'ac +',
'-ad'
],
colon_special_case: [
'var a = {',
' b',
': bval,',
' c:',
'cval',
' ,d: dval',
'};',
'var e = f ? g',
': h;',
'var i = j ? k :',
'l;'
],
catch_all: [
'var d = 1;',
'if (a === b',
' && c) {',
' d = (c * everything',
' / something_else) %',
' b;',
' e',
' += d;',
'',
'} else if (!(complex && simple) ||',
' (emotion && emotion.name === "happy")) {',
' cryTearsOfJoy(many ||',
' anOcean',
' || aRiver);',
'}'
]
};
 
 
//---------//
// Exports //
//---------//
 
module.exports = {
operator_position: operator_position
};
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/javascript/node.mustache
@@ -0,0 +1,1114 @@
/*
{{&header_text}}
 
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/*jshint unused:false */
 
function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify, css_beautify)
{
 
var default_opts = {
indent_size: 4,
indent_char: ' ',
preserve_newlines: true,
jslint_happy: false,
keep_array_indentation: false,
brace_style: 'collapse',
space_before_conditional: true,
break_chained_methods: false,
selector_separator: '\n',
end_with_newline: false
};
var opts;
 
{{#default_options}} default_opts.{{name}} = {{&value}};
{{/default_options}}
 
function reset_options()
{
opts = JSON.parse(JSON.stringify(default_opts));
}
 
function test_js_beautifier(input)
{
return js_beautify(input, opts);
}
 
var sanitytest;
 
// test the input on beautifier with the current flag settings
// does not check the indentation / surroundings as bt() does
function test_fragment(input, expected)
{
expected = expected || expected === '' ? expected : input;
sanitytest.expect(input, expected);
// if the expected is different from input, run it again
// expected output should be unchanged when run twice.
if (expected !== input) {
sanitytest.expect(expected, expected);
}
 
// Everywhere we do newlines, they should be replaced with opts.eol
opts.eol = '\r\\n';
expected = expected.replace(/[\n]/g, '\r\n');
sanitytest.expect(input, expected);
if (input.indexOf('\n') !== -1) {
input = input.replace(/[\n]/g, '\r\n');
sanitytest.expect(input, expected);
// Ensure support for auto eol detection
opts.eol = 'auto';
sanitytest.expect(input, expected);
}
opts.eol = '\n';
}
 
 
 
// test the input on beautifier with the current flag settings
// test both the input as well as { input } wrapping
function bt(input, expectation)
{
var wrapped_input, wrapped_expectation;
 
expectation = expectation || expectation === '' ? expectation : input;
sanitytest.test_function(test_js_beautifier, 'js_beautify');
test_fragment(input, expectation);
 
// If we set raw, input should be unchanged
opts.test_output_raw = true;
if (!opts.end_with_newline) {
test_fragment(input, input);
}
opts.test_output_raw = false;
 
// test also the returned indentation
// e.g if input = "asdf();"
// then test that this remains properly formatted as well:
// {
// asdf();
// indent;
// }
 
var current_indent_size = opts.js ? opts.js.indent_size : null;
current_indent_size = current_indent_size ? current_indent_size : opts.indent_size;
if (current_indent_size === 4 && input) {
wrapped_input = '{\n' + input.replace(/^(.+)$/mg, ' $1') + '\n foo = bar;\n}';
wrapped_expectation = '{\n' + expectation.replace(/^(.+)$/mg, ' $1') + '\n foo = bar;\n}';
test_fragment(wrapped_input, wrapped_expectation);
 
// If we set raw, input should be unchanged
opts.test_output_raw = true;
if (!opts.end_with_newline) {
test_fragment(wrapped_input, wrapped_input);
}
opts.test_output_raw = false;
}
 
}
 
// run all tests for the given brace style ("collapse", "expand", "end-expand", or "none").
// uses various whitespace combinations before and after opening and closing braces,
// respectively, for most of the tests' inputs.
function beautify_brace_tests(brace_style) {
 
var indent_on_wrap_str = ' '; // could use Array(opts.indent_size + 1).join(' '); if we wanted to replace _all_ of the hardcoded 4-space in the test and expectation strings
 
function permute_brace_tests(expect_open_white, expect_close_white) {
 
// run the tests that need permutation against a specific combination of
// pre-opening-brace and pre-closing-brace whitespace
function run_brace_permutation(test_open_white, test_close_white) {
var to = test_open_white,
tc = test_close_white,
eo = expect_open_white ? expect_open_white : to === '' ? ' ' : to,
ec = expect_close_white ? expect_close_white : tc === '' ? ' ' : tc,
i = eo === '\n' ? indent_on_wrap_str: '';
 
bt( '//case 1\nif (a == 1)' + to + '{}\n//case 2\nelse if (a == 2)' + to + '{}',
'//case 1\nif (a == 1)' + eo + '{}\n//case 2\nelse if (a == 2)' + eo + '{}');
bt( 'if(1)' + to + '{2}' + tc + 'else' + to + '{3}',
'if (1)' + eo + '{\n 2\n}' + ec + 'else' + eo + '{\n 3\n}');
bt( 'try' + to + '{a();}' + tc +
'catch(b)' + to + '{c();}' + tc +
'catch(d)' + to + '{}' + tc +
'finally' + to + '{e();}',
// expected
'try' + eo + '{\n a();\n}' + ec +
'catch (b)' + eo + '{\n c();\n}' + ec +
'catch (d)' + eo + '{}' + ec +
'finally' + eo + '{\n e();\n}');
bt( 'if(a)' + to + '{b();}' + tc + 'else if(c) foo();',
'if (a)' + eo + '{\n b();\n}' + ec + 'else if (c) foo();');
// if/else statement with empty body
bt( 'if (a)' + to + '{\n// comment\n}' + tc + 'else' + to + '{\n// comment\n}',
'if (a)' + eo + '{\n // comment\n}' + ec + 'else' + eo + '{\n // comment\n}');
bt( 'if (x)' + to + '{y}' + tc + 'else' + to + '{ if (x)' + to + '{y}}',
'if (x)' + eo + '{\n y\n}' + ec + 'else' + eo + '{\n if (x)' + eo + i + '{\n y\n }\n}');
bt( 'if (a)' + to + '{\nb;\n}' + tc + 'else' + to + '{\nc;\n}',
'if (a)' + eo + '{\n b;\n}' + ec + 'else' + eo + '{\n c;\n}');
test_fragment(' /*\n* xx\n*/\n// xx\nif (foo)' + to + '{\n bar();\n}',
' /*\n * xx\n */\n // xx\n if (foo)' + eo + i + '{\n bar();\n }');
bt( 'if (foo)' + to + '{}' + tc + 'else /regex/.test();',
'if (foo)' + eo + '{}' + ec + 'else /regex/.test();');
test_fragment('if (foo)' + to + '{', 'if (foo)' + eo + '{');
test_fragment('foo' + to + '{', 'foo' + eo + '{');
test_fragment('return;' + to + '{', 'return;' + eo + '{');
bt( 'function x()' + to + '{\n foo();\n}zzz', 'function x()' + eo +'{\n foo();\n}\nzzz');
bt( 'var a = new function a()' + to + '{};', 'var a = new function a()' + eo + '{};');
bt( 'var a = new function a()' + to + ' {},\n b = new function b()' + to + ' {};',
'var a = new function a()' + eo + i + '{},\n b = new function b()' + eo + i + '{};');
bt("foo(" + to + "{\n 'a': 1\n},\n10);",
"foo(" + (eo === ' ' ? '' : eo) + i + "{\n 'a': 1\n },\n 10);"); // "foo( {..." is a weird case
bt('(["foo","bar"]).each(function(i)' + to + '{return i;});',
'(["foo", "bar"]).each(function(i)' + eo + '{\n return i;\n});');
bt('(function(i)' + to + '{return i;})();', '(function(i)' + eo + '{\n return i;\n})();');
 
bt( "test( /*Argument 1*/" + to + "{\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
// expected
"test( /*Argument 1*/" + eo + i + "{\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });");
 
bt( "test( /*Argument 1*/" + to + "{\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */\n" +
"{\n" +
" 'Value2': '2'\n" +
"});",
// expected
"test( /*Argument 1*/" + eo + i + "{\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });");
}
 
run_brace_permutation('\n', '\n');
run_brace_permutation('\n', ' ');
run_brace_permutation(' ', ' ');
run_brace_permutation(' ', '\n');
run_brace_permutation('','');
 
// brace tests that don't make sense to permutate
test_fragment('return {'); // return needs the brace.
test_fragment('return /* inline */ {');
bt('throw {}');
bt('throw {\n foo;\n}');
bt( 'var foo = {}');
test_fragment('a: do {} while (); xxx', 'a: do {} while ();\nxxx');
bt( '{a: do {} while (); xxx}', '{\n a: do {} while ();xxx\n}');
bt( 'var a = new function() {};');
bt( 'var a = new function()\n{};', 'var a = new function() {};');
bt( "test(\n" +
"/*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"},\n" +
"/*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
// expected
"test(\n" +
" /*Argument 1*/\n" +
" {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });");
}
 
reset_options();
opts.brace_style = brace_style;
 
switch(opts.brace_style) {
case 'collapse':
permute_brace_tests(' ', ' ');
break;
case 'expand':
permute_brace_tests('\n', '\n');
break;
case 'end-expand':
permute_brace_tests(' ', '\n');
break;
case 'none':
permute_brace_tests();
break;
}
}
 
function unicode_char(value) {
return String.fromCharCode(value);
}
 
function beautifier_tests()
{
sanitytest = test_obj;
 
{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}
//============================================================
{{^matrix}}
// {{&name}}
reset_options();
{{#options}}
opts.{{name}} = {{&value}};
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}};
{{/tests}}
 
{{/matrix}}
{{#matrix}}
// {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})
reset_options();
{{#options}}
opts.{{name}} = {{&value}};
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}};
{{/tests}}
 
{{/matrix}}
{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}
}
 
function beautifier_unconverted_tests()
{
sanitytest = test_obj;
 
reset_options();
//============================================================
opts.indent_size = 1;
opts.indent_char = ' ';
bt('{ one_char() }', "{\n one_char()\n}");
 
bt('var a,b=1,c=2', 'var a, b = 1,\n c = 2');
 
opts.indent_size = 4;
opts.indent_char = ' ';
bt('{ one_char() }', "{\n one_char()\n}");
 
opts.indent_size = 1;
opts.indent_char = "\t";
bt('{ one_char() }', "{\n\tone_char()\n}");
bt('x = a ? b : c; x;', 'x = a ? b : c;\nx;');
 
//set to something else than it should change to, but with tabs on, should override
opts.indent_size = 5;
opts.indent_char = ' ';
opts.indent_with_tabs = true;
 
bt('{ one_char() }', "{\n\tone_char()\n}");
bt('x = a ? b : c; x;', 'x = a ? b : c;\nx;');
 
opts.indent_size = 4;
opts.indent_char = ' ';
opts.indent_with_tabs = false;
 
reset_options();
//============================================================
opts.preserve_newlines = false;
 
bt('var\na=dont_preserve_newlines;', 'var a = dont_preserve_newlines;');
 
// make sure the blank line between function definitions stays
// even when preserve_newlines = false
bt('function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}');
bt('function foo() {\n return 1;\n}\nfunction foo() {\n return 1;\n}',
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}'
);
bt('function foo() {\n return 1;\n}\n\n\nfunction foo() {\n return 1;\n}',
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}'
);
 
opts.preserve_newlines = true;
bt('var\na=do_preserve_newlines;', 'var\n a = do_preserve_newlines;');
bt('if (foo) // comment\n{\n bar();\n}');
 
 
reset_options();
//============================================================
opts.keep_array_indentation = false;
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f']",
"a = ['a', 'b', 'c',\n 'd', 'e', 'f'\n]");
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']",
"a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i'\n]");
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']",
"a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i'\n]");
bt('var x = [{}\n]', 'var x = [{}]');
bt('var x = [{foo:bar}\n]', 'var x = [{\n foo: bar\n}]');
bt("a = ['something',\n 'completely',\n 'different'];\nif (x);",
"a = ['something',\n 'completely',\n 'different'\n];\nif (x);");
bt("a = ['a','b','c']", "a = ['a', 'b', 'c']");
 
bt("a = ['a', 'b','c']", "a = ['a', 'b', 'c']");
bt("x = [{'a':0}]",
"x = [{\n 'a': 0\n}]");
bt('{a([[a1]], {b;});}',
'{\n a([\n [a1]\n ], {\n b;\n });\n}');
bt("a();\n [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();",
"a();\n[\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n].toString();");
bt("a();\na = [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();",
"a();\na = [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n].toString();");
bt("function() {\n Foo([\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ]);\n}",
"function() {\n Foo([\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ]);\n}");
bt('function foo() {\n return [\n "one",\n "two"\n ];\n}');
// 4 spaces per indent input, processed with 4-spaces per indent
bt( "function foo() {\n" +
" return [\n" +
" {\n" +
" one: 'x',\n" +
" two: [\n" +
" {\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }\n" +
" ]\n" +
" }\n" +
" ];\n" +
"}",
"function foo() {\n" +
" return [{\n" +
" one: 'x',\n" +
" two: [{\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }]\n" +
" }];\n" +
"}");
// 3 spaces per indent input, processed with 4-spaces per indent
bt( "function foo() {\n" +
" return [\n" +
" {\n" +
" one: 'x',\n" +
" two: [\n" +
" {\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }\n" +
" ]\n" +
" }\n" +
" ];\n" +
"}",
"function foo() {\n" +
" return [{\n" +
" one: 'x',\n" +
" two: [{\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }]\n" +
" }];\n" +
"}");
 
opts.keep_array_indentation = true;
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f']");
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']");
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']");
bt('var x = [{}\n]', 'var x = [{}\n]');
bt('var x = [{foo:bar}\n]', 'var x = [{\n foo: bar\n }\n]');
bt("a = ['something',\n 'completely',\n 'different'];\nif (x);");
bt("a = ['a','b','c']", "a = ['a', 'b', 'c']");
bt("a = ['a', 'b','c']", "a = ['a', 'b', 'c']");
bt("x = [{'a':0}]",
"x = [{\n 'a': 0\n}]");
bt('{a([[a1]], {b;});}',
'{\n a([[a1]], {\n b;\n });\n}');
bt("a();\n [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();",
"a();\n [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();");
bt("a();\na = [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();",
"a();\na = [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();");
bt("function() {\n Foo([\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ]);\n}",
"function() {\n Foo([\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ]);\n}");
bt('function foo() {\n return [\n "one",\n "two"\n ];\n}');
// 4 spaces per indent input, processed with 4-spaces per indent
bt( "function foo() {\n" +
" return [\n" +
" {\n" +
" one: 'x',\n" +
" two: [\n" +
" {\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }\n" +
" ]\n" +
" }\n" +
" ];\n" +
"}");
// 3 spaces per indent input, processed with 4-spaces per indent
// Should be unchanged, but is not - #445
// bt( "function foo() {\n" +
// " return [\n" +
// " {\n" +
// " one: 'x',\n" +
// " two: [\n" +
// " {\n" +
// " id: 'a',\n" +
// " name: 'apple'\n" +
// " }, {\n" +
// " id: 'b',\n" +
// " name: 'banana'\n" +
// " }\n" +
// " ]\n" +
// " }\n" +
// " ];\n" +
// "}");
 
 
reset_options();
//============================================================
bt('a = //comment\n /regex/;');
 
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n} else {\n c;\n}');
 
// tests for brace positioning
beautify_brace_tests('expand');
beautify_brace_tests('collapse');
beautify_brace_tests('end-expand');
beautify_brace_tests('none');
 
test_fragment('roo = {\n /*\n ****\n FOO\n ****\n */\n BAR: 0\n};');
 
bt('"foo""bar""baz"', '"foo"\n"bar"\n"baz"');
bt("'foo''bar''baz'", "'foo'\n'bar'\n'baz'");
 
 
test_fragment("if (zz) {\n // ....\n}\n(function");
 
bt("{\n get foo() {}\n}");
bt("{\n var a = get\n foo();\n}");
bt("{\n set foo() {}\n}");
bt("{\n var a = set\n foo();\n}");
bt("var x = {\n get function()\n}");
bt("var x = {\n set function()\n}");
 
// According to my current research get/set have no special meaning outside of an object literal
bt("var x = set\n\na() {}", "var x = set\n\na() {}");
bt("var x = set\n\nfunction() {}", "var x = set\n\nfunction() {}");
 
bt('<!-- foo\nbar();\n-->');
bt('<!-- dont crash'); // -->
bt('for () /abc/.test()');
bt('if (k) /aaa/m.test(v) && l();');
bt('switch (true) {\n case /swf/i.test(foo):\n bar();\n}');
bt('createdAt = {\n type: Date,\n default: Date.now\n}');
bt('switch (createdAt) {\n case a:\n Date,\n default:\n Date.now\n}');
 
reset_options();
//============================================================
opts.space_before_conditional = false;
bt('if(a) b()');
 
 
reset_options();
//============================================================
opts.preserve_newlines = true;
bt('var a = 42; // foo\n\nvar b;');
bt('var a = 42; // foo\n\n\nvar b;');
bt("var a = 'foo' +\n 'bar';");
bt("var a = \"foo\" +\n \"bar\";");
bt('this.oa = new OAuth(\n' +
' _requestToken,\n' +
' _accessToken,\n' +
' consumer_key\n' +
');');
 
 
reset_options();
//============================================================
opts.unescape_strings = false;
bt('"\\\\s"'); // == "\\s" in the js source
bt("'\\\\s'"); // == '\\s' in the js source
bt("'\\\\\\s'"); // == '\\\s' in the js source
bt("'\\s'"); // == '\s' in the js source
bt('"•"');
bt('"—"');
bt('"\\x41\\x42\\x43\\x01"', '"\\x41\\x42\\x43\\x01"');
bt('"\\u2022"', '"\\u2022"');
bt('a = /\s+/');
// bt('a = /\\x41/','a = /A/');
bt('"\\u2022";a = /\s+/;"\\x41\\x42\\x43\\x01".match(/\\x41/);','"\\u2022";\na = /\s+/;\n"\\x41\\x42\\x43\\x01".match(/\\x41/);');
test_fragment('"\\x22\\x27",\'\\x22\\x27\',"\\x5c",\'\\x5c\',"\\xff and \\xzz","unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"', '"\\x22\\x27", \'\\x22\\x27\', "\\x5c", \'\\x5c\', "\\xff and \\xzz", "unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"');
 
opts.unescape_strings = true;
test_fragment('"\\x20\\x40\\x4a"', '" @J"');
test_fragment('"\\xff\\x40\\x4a"');
test_fragment('"\\u0072\\u016B\\u0137\\u012B\\u0074\\u0069\\u0073"', '"\u0072\u016B\u0137\u012B\u0074\u0069\u0073"');
test_fragment('"Google Chrome est\\u00E1 actualizado."', '"Google Chrome está actualizado."');
test_fragment('"\\x22\\x27",\'\\x22\\x27\',"\\x5c",\'\\x5c\',"\\xff and \\xzz","unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff"',
'"\\"\\\'", \'\\"\\\'\', "\\\\", \'\\\\\', "\\xff and \\xzz", "unicode \\u0000 \\" \\\' \\\\ ' + unicode_char(0xffff) + '"');
 
// For error case, return the string unchanged
test_fragment('"\\x22\\x27",\'\\x22\\x27\',"\\x5c",\'\\x5c\',"\\xff and \\xzz","unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"',
'"\\"\\\'", \'\\"\\\'\', "\\\\", \'\\\\\', "\\xff and \\xzz", "unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"');
 
reset_options();
//============================================================
bt('return function();');
bt('var a = function();');
bt('var a = 5 + function();');
 
bt('import foo.*;', 'import foo.*;'); // actionscript's import
test_fragment('function f(a: a, b: b)'); // actionscript
 
bt('{\n foo // something\n ,\n bar // something\n baz\n}');
bt('function a(a) {} function b(b) {} function c(c) {}', 'function a(a) {}\n\nfunction b(b) {}\n\nfunction c(c) {}');
bt('foo(a, function() {})');
 
bt('foo(a, /regex/)');
 
bt('/* foo */\n"x"');
 
reset_options();
//============================================================
opts.break_chained_methods = false;
opts.preserve_newlines = false;
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat)');
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat);\nfoo.bar().baz().cucumber(fat)');
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat)\nfoo.bar().baz().cucumber(fat)');
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this.something = foo.bar().baz().cucumber(fat)');
bt('this.something.xxx = foo.moo.bar()');
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this.something.xxx = foo.moo.bar()');
 
opts.break_chained_methods = false;
opts.preserve_newlines = true;
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat)');
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat);\nfoo.bar().baz().cucumber(fat)');
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat)\nfoo.bar().baz().cucumber(fat)');
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this\n .something = foo.bar()\n .baz().cucumber(fat)');
bt('this.something.xxx = foo.moo.bar()');
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this\n .something\n .xxx = foo.moo\n .bar()');
 
opts.break_chained_methods = true;
opts.preserve_newlines = false;
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat)');
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat);\nfoo.bar()\n .baz()\n .cucumber(fat)');
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat)\nfoo.bar()\n .baz()\n .cucumber(fat)');
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this.something = foo.bar()\n .baz()\n .cucumber(fat)');
bt('this.something.xxx = foo.moo.bar()');
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this.something.xxx = foo.moo.bar()');
 
opts.break_chained_methods = true;
opts.preserve_newlines = true;
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat)');
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat);\nfoo.bar()\n .baz()\n .cucumber(fat)');
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat)\nfoo.bar()\n .baz()\n .cucumber(fat)');
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this\n .something = foo.bar()\n .baz()\n .cucumber(fat)');
bt('this.something.xxx = foo.moo.bar()');
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this\n .something\n .xxx = foo.moo\n .bar()');
 
reset_options();
//============================================================
// Line wrap test intputs
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
wrap_input_1=('foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}');
 
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
wrap_input_2=('{\n' +
' foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
' Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' +
' return between_return_and_expression_should_never_wrap.but_this_can\n' +
' throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
' if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();\n' +
' object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
' }' +
'}');
 
opts.preserve_newlines = false;
opts.wrap_line_length = 0;
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
/* expected */
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap.but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_.okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}');
 
opts.wrap_line_length = 70;
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
/* expected */
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap.but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_.okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}');
 
opts.wrap_line_length = 40;
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
/* expected */
'foo.bar().baz().cucumber((fat &&\n' +
' "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_.okay();\n' +
'object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
'}');
 
opts.wrap_line_length = 41;
// NOTE: wrap is only best effort - line continues until next wrap point is found.
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
/* expected */
'foo.bar().baz().cucumber((fat && "sassy") ||\n' +
' (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_.okay();\n' +
'object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
'}');
 
opts.wrap_line_length = 45;
// NOTE: wrap is only best effort - line continues until next wrap point is found.
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_2,
/* expected */
'{\n' +
' foo.bar().baz().cucumber((fat && "sassy") ||\n' +
' (leans && mean));\n' +
' Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
' return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
' throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
' if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_.okay();\n' +
' object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
' }\n'+
'}');
 
opts.preserve_newlines = true;
opts.wrap_line_length = 0;
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
/* expected */
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_\n' +
' .okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}');
 
opts.wrap_line_length = 70;
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
/* expected */
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_\n' +
' .okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}');
 
 
opts.wrap_line_length = 40;
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
/* expected */
'foo.bar().baz().cucumber((fat &&\n' +
' "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_\n' +
' .okay();\n' +
'object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
'}');
 
opts.wrap_line_length = 41;
// NOTE: wrap is only best effort - line continues until next wrap point is found.
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
/* expected */
'foo.bar().baz().cucumber((fat && "sassy") ||\n' +
' (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_\n' +
' .okay();\n' +
'object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
'}');
 
opts.wrap_line_length = 45;
// NOTE: wrap is only best effort - line continues until next wrap point is found.
//.............---------1---------2---------3---------4---------5---------6---------7
//.............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_2,
/* expected */
'{\n' +
' foo.bar().baz().cucumber((fat && "sassy") ||\n' +
' (leans && mean));\n' +
' Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
' return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
' throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
' if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_\n' +
' .okay();\n' +
' object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
' }\n'+
'}');
 
reset_options();
//============================================================
opts.preserve_newlines = false;
bt('if (foo) // comment\n bar();');
bt('if (foo) // comment\n (bar());');
bt('if (foo) // comment\n (bar());');
bt('if (foo) // comment\n /asdf/;');
bt('this.oa = new OAuth(\n' +
' _requestToken,\n' +
' _accessToken,\n' +
' consumer_key\n' +
');',
'this.oa = new OAuth(_requestToken, _accessToken, consumer_key);');
bt('foo = {\n x: y, // #44\n w: z // #44\n}');
bt('switch (x) {\n case "a":\n // comment on newline\n break;\n case "b": // comment on same line\n break;\n}');
bt('this.type =\n this.options =\n // comment\n this.enabled null;',
'this.type = this.options =\n // comment\n this.enabled null;');
bt('someObj\n .someFunc1()\n // This comment should not break the indent\n .someFunc2();',
'someObj.someFunc1()\n // This comment should not break the indent\n .someFunc2();');
 
bt('if (true ||\n!true) return;', 'if (true || !true) return;');
 
// these aren't ready yet.
//bt('if (foo) // comment\n bar() /*i*/ + baz() /*j\n*/ + asdf();');
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\na();',
'if (foo)\n if (bar)\n if (baz) whee();\na();');
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\nelse\na();',
'if (foo)\n if (bar)\n if (baz) whee();\n else a();');
bt('if (foo)\nbar();\nelse\ncar();',
'if (foo) bar();\nelse car();');
 
bt('if (foo) if (bar) if (baz);\na();',
'if (foo)\n if (bar)\n if (baz);\na();');
bt('if (foo) if (bar) if (baz) whee();\na();',
'if (foo)\n if (bar)\n if (baz) whee();\na();');
bt('if (foo) a()\nif (bar) if (baz) whee();\na();',
'if (foo) a()\nif (bar)\n if (baz) whee();\na();');
bt('if (foo);\nif (bar) if (baz) whee();\na();',
'if (foo);\nif (bar)\n if (baz) whee();\na();');
bt('if (options)\n' +
' for (var p in options)\n' +
' this[p] = options[p];',
'if (options)\n'+
' for (var p in options) this[p] = options[p];');
bt('if (options) for (var p in options) this[p] = options[p];',
'if (options)\n for (var p in options) this[p] = options[p];');
 
bt('if (options) do q(); while (b());',
'if (options)\n do q(); while (b());');
bt('if (options) while (b()) q();',
'if (options)\n while (b()) q();');
bt('if (options) do while (b()) q(); while (a());',
'if (options)\n do\n while (b()) q(); while (a());');
 
bt('function f(a, b, c,\nd, e) {}',
'function f(a, b, c, d, e) {}');
 
bt('function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}',
'function f(a, b) {\n if (a) b()\n}\n\nfunction g(a, b) {\n if (!a) b()\n}');
bt('function f(a,b) {if(a) b()}\n\n\n\nfunction g(a,b) {if(!a) b()}',
'function f(a, b) {\n if (a) b()\n}\n\nfunction g(a, b) {\n if (!a) b()\n}');
 
// This is not valid syntax, but still want to behave reasonably and not side-effect
bt('(if(a) b())(if(a) b())',
'(\n if (a) b())(\n if (a) b())');
bt('(if(a) b())\n\n\n(if(a) b())',
'(\n if (a) b())\n(\n if (a) b())');
 
 
 
bt("if\n(a)\nb();", "if (a) b();");
bt('var a =\nfoo', 'var a = foo');
bt('var a = {\n"a":1,\n"b":2}', "var a = {\n \"a\": 1,\n \"b\": 2\n}");
bt("var a = {\n'a':1,\n'b':2}", "var a = {\n 'a': 1,\n 'b': 2\n}");
bt('var a = /*i*/ "b";');
bt('var a = /*i*/\n"b";', 'var a = /*i*/ "b";');
bt('var a = /*i*/\nb;', 'var a = /*i*/ b;');
bt('{\n\n\n"x"\n}', '{\n "x"\n}');
bt('if(a &&\nb\n||\nc\n||d\n&&\ne) e = f', 'if (a && b || c || d && e) e = f');
bt('if(a &&\n(b\n||\nc\n||d)\n&&\ne) e = f', 'if (a && (b || c || d) && e) e = f');
test_fragment('\n\n"x"', '"x"');
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;',
'a = 1;\nb = 2;');
 
opts.preserve_newlines = true;
bt('if (foo) // comment\n bar();');
bt('if (foo) // comment\n (bar());');
bt('if (foo) // comment\n (bar());');
bt('if (foo) // comment\n /asdf/;');
bt('foo = {\n x: y, // #44\n w: z // #44\n}');
bt('switch (x) {\n case "a":\n // comment on newline\n break;\n case "b": // comment on same line\n break;\n}');
bt('this.type =\n this.options =\n // comment\n this.enabled null;');
bt('someObj\n .someFunc1()\n // This comment should not break the indent\n .someFunc2();');
 
bt('if (true ||\n!true) return;', 'if (true ||\n !true) return;');
 
// these aren't ready yet.
// bt('if (foo) // comment\n bar() /*i*/ + baz() /*j\n*/ + asdf();');
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\na();',
'if (foo)\n if (bar)\n if (baz)\n whee();\na();');
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\nelse\na();',
'if (foo)\n if (bar)\n if (baz)\n whee();\n else\n a();');
bt('if (foo)\nbar();\nelse\ncar();',
'if (foo)\n bar();\nelse\n car();');
bt('if (foo) bar();\nelse\ncar();',
'if (foo) bar();\nelse\n car();');
 
bt('if (foo) if (bar) if (baz);\na();',
'if (foo)\n if (bar)\n if (baz);\na();');
bt('if (foo) if (bar) if (baz) whee();\na();',
'if (foo)\n if (bar)\n if (baz) whee();\na();');
bt('if (foo) a()\nif (bar) if (baz) whee();\na();',
'if (foo) a()\nif (bar)\n if (baz) whee();\na();');
bt('if (foo);\nif (bar) if (baz) whee();\na();',
'if (foo);\nif (bar)\n if (baz) whee();\na();');
bt('if (options)\n' +
' for (var p in options)\n' +
' this[p] = options[p];');
bt('if (options) for (var p in options) this[p] = options[p];',
'if (options)\n for (var p in options) this[p] = options[p];');
 
bt('if (options) do q(); while (b());',
'if (options)\n do q(); while (b());');
bt('if (options) do; while (b());',
'if (options)\n do; while (b());');
bt('if (options) while (b()) q();',
'if (options)\n while (b()) q();');
bt('if (options) do while (b()) q(); while (a());',
'if (options)\n do\n while (b()) q(); while (a());');
 
bt('function f(a, b, c,\nd, e) {}',
'function f(a, b, c,\n d, e) {}');
 
bt('function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}',
'function f(a, b) {\n if (a) b()\n}\n\nfunction g(a, b) {\n if (!a) b()\n}');
bt('function f(a,b) {if(a) b()}\n\n\n\nfunction g(a,b) {if(!a) b()}',
'function f(a, b) {\n if (a) b()\n}\n\n\n\nfunction g(a, b) {\n if (!a) b()\n}');
// This is not valid syntax, but still want to behave reasonably and not side-effect
bt('(if(a) b())(if(a) b())',
'(\n if (a) b())(\n if (a) b())');
bt('(if(a) b())\n\n\n(if(a) b())',
'(\n if (a) b())\n\n\n(\n if (a) b())');
 
// space between functions
bt('/*\n * foo\n */\nfunction foo() {}');
bt('// a nice function\nfunction foo() {}');
bt('function foo() {}\nfunction foo() {}',
'function foo() {}\n\nfunction foo() {}'
);
 
bt('[\n function() {}\n]');
 
 
 
bt("if\n(a)\nb();", "if (a)\n b();");
bt('var a =\nfoo', 'var a =\n foo');
bt('var a = {\n"a":1,\n"b":2}', "var a = {\n \"a\": 1,\n \"b\": 2\n}");
bt("var a = {\n'a':1,\n'b':2}", "var a = {\n 'a': 1,\n 'b': 2\n}");
bt('var a = /*i*/ "b";');
bt('var a = /*i*/\n"b";', 'var a = /*i*/\n "b";');
bt('var a = /*i*/\nb;', 'var a = /*i*/\n b;');
bt('{\n\n\n"x"\n}', '{\n\n\n "x"\n}');
bt('if(a &&\nb\n||\nc\n||d\n&&\ne) e = f', 'if (a &&\n b ||\n c ||\n d &&\n e) e = f');
bt('if(a &&\n(b\n||\nc\n||d)\n&&\ne) e = f', 'if (a &&\n (b ||\n c ||\n d) &&\n e) e = f');
test_fragment('\n\n"x"', '"x"');
 
// this beavior differs between js and python, defaults to unlimited in js, 10 in python
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;',
'a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;');
opts.max_preserve_newlines = 8;
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;',
'a = 1;\n\n\n\n\n\n\n\nb = 2;');
 
reset_options();
//============================================================
 
 
Urlencoded.run_tests(sanitytest);
}
 
beautifier_tests();
beautifier_unconverted_tests();
}
 
if (typeof exports !== "undefined") {
exports.run_javascript_tests = run_javascript_tests;
}
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/javascript/python.mustache
@@ -0,0 +1,1322 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
'''
{{&header_text}}
 
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'''
 
import re
import unittest
import jsbeautifier
import six
import copy
 
class TestJSBeautifier(unittest.TestCase):
options = None
 
@classmethod
def setUpClass(cls):
true = True
false = False
 
default_options = jsbeautifier.default_options()
default_options.indent_size = 4
default_options.indent_char = ' '
default_options.preserve_newlines = True
default_options.jslint_happy = False
default_options.keep_array_indentation = False
default_options.brace_style = 'collapse'
default_options.indent_level = 0
default_options.break_chained_methods = False
default_options.eol = '\n'
 
{{#default_options}} default_options.{{name}} = {{&value}}
{{/default_options}}
 
cls.default_options = default_options
cls.wrapregex = re.compile('^(.+)$', re.MULTILINE)
 
def reset_options(self):
self.options = copy.copy(self.default_options)
 
def test_unescape(self):
# Test cases contributed by <chrisjshull on GitHub.com>
test_fragment = self.decodesto
self.reset_options()
bt = self.bt
 
def unicode_char(value):
return six.unichr(value)
 
bt('"\\\\s"') # == "\\s" in the js source
bt("'\\\\s'") # == '\\s' in the js source
bt("'\\\\\\s'") # == '\\\s' in the js source
bt("'\\s'") # == '\s' in the js source
bt('"•"')
bt('"—"')
bt('"\\x41\\x42\\x43\\x01"', '"\\x41\\x42\\x43\\x01"')
bt('"\\u2022"', '"\\u2022"')
bt('a = /\s+/')
#bt('a = /\\x41/','a = /A/')
bt('"\\u2022";a = /\s+/;"\\x41\\x42\\x43\\x01".match(/\\x41/);','"\\u2022";\na = /\s+/;\n"\\x41\\x42\\x43\\x01".match(/\\x41/);')
test_fragment('"\\x22\\x27",\'\\x22\\x27\',"\\x5c",\'\\x5c\',"\\xff and \\xzz","unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"', '"\\x22\\x27", \'\\x22\\x27\', "\\x5c", \'\\x5c\', "\\xff and \\xzz", "unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"')
 
self.options.unescape_strings = True
 
bt('"\\x41\\x42\\x43\\x01"', '"ABC\\x01"')
test_fragment('"\\x20\\x40\\x4a"', '" @J"');
test_fragment('"\\xff\\x40\\x4a"');
test_fragment('"\\u0072\\u016B\\u0137\\u012B\\u0074\\u0069\\u0073"', six.u('"\u0072\u016B\u0137\u012B\u0074\u0069\u0073"'));
 
bt('a = /\s+/')
test_fragment('"\\x22\\x27",\'\\x22\\x27\',"\\x5c",\'\\x5c\',"\\xff","unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff"',
'"\\"\\\'", \'\\"\\\'\', "\\\\", \'\\\\\', "\\xff", "unicode \\u0000 \\" \\\' \\\\ ' + unicode_char(0xffff) + '"');
 
# For error case, return the string unchanged
test_fragment('"\\x22\\x27",\'\\x22\\x27\',"\\x5c",\'\\x5c\',"\\xff and \\xzz","unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"',
'"\\"\\\'", \'\\"\\\'\', "\\\\", \'\\\\\', "\\xff and \\xzz", "unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"');
 
self.options.unescape_strings = False
 
def test_beautifier(self):
test_fragment = self.decodesto
bt = self.bt
 
true = True
false = False
 
def unicode_char(value):
return six.unichr(value)
 
{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}
#============================================================
{{^matrix}}
# {{&name}}
self.reset_options();
{{#options}}
self.options.{{name}} = {{&value}}
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}}
{{/tests}}
 
{{/matrix}}
{{#matrix}}
# {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})
self.reset_options();
{{#options}}
self.options.{{name}} = {{&value}}
{{/options}}
{{#tests}}
{{#test_line}}.{{/test_line}}
{{/tests}}
 
{{/matrix}}
{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}
 
def test_beautifier_unconverted(self):
test_fragment = self.decodesto
bt = self.bt
 
self.reset_options();
#============================================================
self.options.indent_size = 1;
self.options.indent_char = ' ';
bt('{ one_char() }', "{\n one_char()\n}")
 
bt('var a,b=1,c=2', 'var a, b = 1,\n c = 2')
 
self.options.indent_size = 4;
self.options.indent_char = ' ';
bt('{ one_char() }', "{\n one_char()\n}")
 
self.options.indent_size = 1;
self.options.indent_char = "\t";
bt('{ one_char() }', "{\n\tone_char()\n}")
bt('x = a ? b : c; x;', 'x = a ? b : c;\nx;')
 
#set to something else than it should change to, but with tabs on, should override
self.options.indent_size = 5;
self.options.indent_char = ' ';
self.options.indent_with_tabs = True;
 
bt('{ one_char() }', "{\n\tone_char()\n}")
bt('x = a ? b : c; x;', 'x = a ? b : c;\nx;')
 
 
self.reset_options();
#============================================================
self.options.preserve_newlines = False;
bt('var\na=dont_preserve_newlines;', 'var a = dont_preserve_newlines;')
 
# make sure the blank line between function definitions stays
# even when preserve_newlines = False
bt('function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}')
bt('function foo() {\n return 1;\n}\nfunction foo() {\n return 1;\n}',
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}'
)
bt('function foo() {\n return 1;\n}\n\n\nfunction foo() {\n return 1;\n}',
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}'
)
 
 
self.options.preserve_newlines = True;
bt('var\na=do_preserve_newlines;', 'var\n a = do_preserve_newlines;')
bt('if (foo) // comment\n{\n bar();\n}')
 
 
self.reset_options();
#============================================================
self.options.keep_array_indentation = False;
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f']",
"a = ['a', 'b', 'c',\n 'd', 'e', 'f'\n]")
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']",
"a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i'\n]")
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']",
"a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i'\n]")
bt('var x = [{}\n]', 'var x = [{}]')
bt('var x = [{foo:bar}\n]', 'var x = [{\n foo: bar\n}]')
bt("a = ['something',\n 'completely',\n 'different'];\nif (x);",
"a = ['something',\n 'completely',\n 'different'\n];\nif (x);")
bt("a = ['a','b','c']", "a = ['a', 'b', 'c']")
bt("a = ['a', 'b','c']", "a = ['a', 'b', 'c']")
bt("x = [{'a':0}]",
"x = [{\n 'a': 0\n}]")
bt('{a([[a1]], {b;});}',
'{\n a([\n [a1]\n ], {\n b;\n });\n}')
bt("a();\n [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();",
"a();\n[\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n].toString();")
bt("a();\na = [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();",
"a();\na = [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n].toString();")
bt("function() {\n Foo([\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ]);\n}",
"function() {\n Foo([\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ]);\n}")
bt('function foo() {\n return [\n "one",\n "two"\n ];\n}')
# 4 spaces per indent input, processed with 4-spaces per indent
bt( "function foo() {\n" +
" return [\n" +
" {\n" +
" one: 'x',\n" +
" two: [\n" +
" {\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }\n" +
" ]\n" +
" }\n" +
" ];\n" +
"}",
"function foo() {\n" +
" return [{\n" +
" one: 'x',\n" +
" two: [{\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }]\n" +
" }];\n" +
"}")
# 3 spaces per indent input, processed with 4-spaces per indent
bt( "function foo() {\n" +
" return [\n" +
" {\n" +
" one: 'x',\n" +
" two: [\n" +
" {\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }\n" +
" ]\n" +
" }\n" +
" ];\n" +
"}",
"function foo() {\n" +
" return [{\n" +
" one: 'x',\n" +
" two: [{\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }]\n" +
" }];\n" +
"}")
 
self.options.keep_array_indentation = True;
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f']")
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']")
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']")
bt('var x = [{}\n]', 'var x = [{}\n]')
bt('var x = [{foo:bar}\n]', 'var x = [{\n foo: bar\n }\n]')
bt("a = ['something',\n 'completely',\n 'different'];\nif (x);")
bt("a = ['a','b','c']", "a = ['a', 'b', 'c']")
bt("a = ['a', 'b','c']", "a = ['a', 'b', 'c']")
bt("x = [{'a':0}]",
"x = [{\n 'a': 0\n}]")
bt('{a([[a1]], {b;});}',
'{\n a([[a1]], {\n b;\n });\n}')
bt("a();\n [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();",
"a();\n [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();")
bt("a();\na = [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();",
"a();\na = [\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ].toString();")
bt("function() {\n Foo([\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ]);\n}",
"function() {\n Foo([\n ['sdfsdfsd'],\n ['sdfsdfsdf']\n ]);\n}")
bt('function foo() {\n return [\n "one",\n "two"\n ];\n}')
# 4 spaces per indent input, processed with 4-spaces per indent
bt( "function foo() {\n" +
" return [\n" +
" {\n" +
" one: 'x',\n" +
" two: [\n" +
" {\n" +
" id: 'a',\n" +
" name: 'apple'\n" +
" }, {\n" +
" id: 'b',\n" +
" name: 'banana'\n" +
" }\n" +
" ]\n" +
" }\n" +
" ];\n" +
"}")
# 3 spaces per indent input, processed with 4-spaces per indent
# Should be unchanged, but is not - #445
# bt( "function foo() {\n" +
# " return [\n" +
# " {\n" +
# " one: 'x',\n" +
# " two: [\n" +
# " {\n" +
# " id: 'a',\n" +
# " name: 'apple'\n" +
# " }, {\n" +
# " id: 'b',\n" +
# " name: 'banana'\n" +
# " }\n" +
# " ]\n" +
# " }\n" +
# " ];\n" +
# "}")
 
self.reset_options();
#============================================================
bt('a = //comment\n /regex/;')
 
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n} else {\n c;\n}')
 
bt('var a = new function();')
test_fragment('new function')
 
self.reset_options();
#============================================================
# START tests for brace positioning
 
# If this is ever supported, update tests for each brace style.
# test_fragment('return\n{', 'return\n{') # can't support this?, but that's an improbable and extreme case anyway.
 
self.options.brace_style = 'expand';
 
bt('//case 1\nif (a == 1)\n{}\n//case 2\nelse if (a == 2)\n{}')
bt('if(1){2}else{3}', "if (1)\n{\n 2\n}\nelse\n{\n 3\n}")
bt('try{a();}catch(b){c();}catch(d){}finally{e();}',
"try\n{\n a();\n}\ncatch (b)\n{\n c();\n}\ncatch (d)\n{}\nfinally\n{\n e();\n}")
bt('if(a){b();}else if(c) foo();',
"if (a)\n{\n b();\n}\nelse if (c) foo();")
bt("if (a) {\n// comment\n}else{\n// comment\n}",
"if (a)\n{\n // comment\n}\nelse\n{\n // comment\n}") # if/else statement with empty body
bt('if (x) {y} else { if (x) {y}}',
'if (x)\n{\n y\n}\nelse\n{\n if (x)\n {\n y\n }\n}')
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}',
'if (a)\n{\n b;\n}\nelse\n{\n c;\n}')
test_fragment(' /*\n* xx\n*/\n// xx\nif (foo) {\n bar();\n}',
' /*\n * xx\n */\n // xx\n if (foo)\n {\n bar();\n }')
bt('if (foo)\n{}\nelse /regex/.test();')
test_fragment('if (foo) {', 'if (foo)\n{')
test_fragment('foo {', 'foo\n{')
test_fragment('return {', 'return {') # return needs the brace.
test_fragment('return /* inline */ {', 'return /* inline */ {')
test_fragment('return;\n{', 'return;\n{')
bt("throw {}")
bt("throw {\n foo;\n}")
bt('var foo = {}')
bt('function x() {\n foo();\n}zzz', 'function x()\n{\n foo();\n}\nzzz')
test_fragment('a: do {} while (); xxx', 'a: do {} while ();\nxxx')
bt('{a: do {} while (); xxx}', '{\n a: do {} while ();xxx\n}')
bt('var a = new function() {};')
bt('var a = new function a() {};', 'var a = new function a()\n{};')
bt('var a = new function()\n{};', 'var a = new function() {};')
bt('var a = new function a()\n{};')
bt('var a = new function a()\n {},\n b = new function b()\n {};')
bt("foo({\n 'a': 1\n},\n10);",
"foo(\n {\n 'a': 1\n },\n 10);")
bt('(["foo","bar"]).each(function(i) {return i;});',
'(["foo", "bar"]).each(function(i)\n{\n return i;\n});')
bt('(function(i) {return i;})();',
'(function(i)\n{\n return i;\n})();')
bt( "test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test( /*Argument 1*/\n" +
" {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
bt( "test(\n" +
"/*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"},\n" +
"/*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test(\n" +
" /*Argument 1*/\n" +
" {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
bt( "test( /*Argument 1*/\n" +
"{\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */\n" +
"{\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test( /*Argument 1*/\n" +
" {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
 
self.options.brace_style = 'collapse';
 
bt('//case 1\nif (a == 1) {}\n//case 2\nelse if (a == 2) {}')
bt('if(1){2}else{3}', "if (1) {\n 2\n} else {\n 3\n}")
bt('try{a();}catch(b){c();}catch(d){}finally{e();}',
"try {\n a();\n} catch (b) {\n c();\n} catch (d) {} finally {\n e();\n}")
bt('if(a){b();}else if(c) foo();',
"if (a) {\n b();\n} else if (c) foo();")
bt("if (a) {\n// comment\n}else{\n// comment\n}",
"if (a) {\n // comment\n} else {\n // comment\n}") # if/else statement with empty body
bt('if (x) {y} else { if (x) {y}}',
'if (x) {\n y\n} else {\n if (x) {\n y\n }\n}')
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}',
'if (a) {\n b;\n} else {\n c;\n}')
test_fragment(' /*\n* xx\n*/\n// xx\nif (foo) {\n bar();\n}',
' /*\n * xx\n */\n // xx\n if (foo) {\n bar();\n }')
bt('if (foo) {} else /regex/.test();')
test_fragment('if (foo) {', 'if (foo) {')
test_fragment('foo {', 'foo {')
test_fragment('return {', 'return {') # return needs the brace.
test_fragment('return /* inline */ {', 'return /* inline */ {')
test_fragment('return;\n{', 'return; {')
bt("throw {}")
bt("throw {\n foo;\n}")
bt('var foo = {}')
bt('function x() {\n foo();\n}zzz', 'function x() {\n foo();\n}\nzzz')
test_fragment('a: do {} while (); xxx', 'a: do {} while ();\nxxx')
bt('{a: do {} while (); xxx}', '{\n a: do {} while ();xxx\n}')
bt('var a = new function() {};')
bt('var a = new function a() {};')
bt('var a = new function()\n{};', 'var a = new function() {};')
bt('var a = new function a()\n{};', 'var a = new function a() {};')
bt('var a = new function a()\n {},\n b = new function b()\n {};', 'var a = new function a() {},\n b = new function b() {};')
bt("foo({\n 'a': 1\n},\n10);",
"foo({\n 'a': 1\n },\n 10);")
bt('(["foo","bar"]).each(function(i) {return i;});',
'(["foo", "bar"]).each(function(i) {\n return i;\n});')
bt('(function(i) {return i;})();',
'(function(i) {\n return i;\n})();')
bt( "test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
bt( "test(\n" +
"/*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"},\n" +
"/*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test(\n" +
" /*Argument 1*/\n" +
" {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
bt( "test( /*Argument 1*/\n" +
"{\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */\n" +
"{\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
 
self.options.brace_style = "end-expand";
 
bt('//case 1\nif (a == 1) {}\n//case 2\nelse if (a == 2) {}')
bt('if(1){2}else{3}', "if (1) {\n 2\n}\nelse {\n 3\n}")
bt('try{a();}catch(b){c();}catch(d){}finally{e();}',
"try {\n a();\n}\ncatch (b) {\n c();\n}\ncatch (d) {}\nfinally {\n e();\n}")
bt('if(a){b();}else if(c) foo();',
"if (a) {\n b();\n}\nelse if (c) foo();")
bt("if (a) {\n// comment\n}else{\n// comment\n}",
"if (a) {\n // comment\n}\nelse {\n // comment\n}") # if/else statement with empty body
bt('if (x) {y} else { if (x) {y}}',
'if (x) {\n y\n}\nelse {\n if (x) {\n y\n }\n}')
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}',
'if (a) {\n b;\n}\nelse {\n c;\n}')
test_fragment(' /*\n* xx\n*/\n// xx\nif (foo) {\n bar();\n}',
' /*\n * xx\n */\n // xx\n if (foo) {\n bar();\n }')
bt('if (foo) {}\nelse /regex/.test();')
test_fragment('if (foo) {', 'if (foo) {')
test_fragment('foo {', 'foo {')
test_fragment('return {', 'return {') # return needs the brace.
test_fragment('return /* inline */ {', 'return /* inline */ {')
test_fragment('return;\n{', 'return; {')
bt("throw {}")
bt("throw {\n foo;\n}")
bt('var foo = {}')
bt('function x() {\n foo();\n}zzz', 'function x() {\n foo();\n}\nzzz')
test_fragment('a: do {} while (); xxx', 'a: do {} while ();\nxxx')
bt('{a: do {} while (); xxx}', '{\n a: do {} while ();xxx\n}')
bt('var a = new function() {};')
bt('var a = new function a() {};')
bt('var a = new function()\n{};', 'var a = new function() {};')
bt('var a = new function a()\n{};', 'var a = new function a() {};')
bt('var a = new function a()\n {},\n b = new function b()\n {};', 'var a = new function a() {},\n b = new function b() {};')
bt("foo({\n 'a': 1\n},\n10);",
"foo({\n 'a': 1\n },\n 10);")
bt('(["foo","bar"]).each(function(i) {return i;});',
'(["foo", "bar"]).each(function(i) {\n return i;\n});')
bt('(function(i) {return i;})();',
'(function(i) {\n return i;\n})();')
bt( "test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
bt( "test(\n" +
"/*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"},\n" +
"/*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test(\n" +
" /*Argument 1*/\n" +
" {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
bt( "test( /*Argument 1*/\n" +
"{\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */\n" +
"{\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
 
self.options.brace_style = 'none';
 
bt('//case 1\nif (a == 1)\n{}\n//case 2\nelse if (a == 2)\n{}')
bt('if(1){2}else{3}', "if (1) {\n 2\n} else {\n 3\n}")
bt('try{a();}catch(b){c();}catch(d){}finally{e();}',
"try {\n a();\n} catch (b) {\n c();\n} catch (d) {} finally {\n e();\n}")
bt('if(a){b();}else if(c) foo();',
"if (a) {\n b();\n} else if (c) foo();")
bt("if (a) {\n// comment\n}else{\n// comment\n}",
"if (a) {\n // comment\n} else {\n // comment\n}") # if/else statement with empty body
bt('if (x) {y} else { if (x) {y}}',
'if (x) {\n y\n} else {\n if (x) {\n y\n }\n}')
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}',
'if (a)\n{\n b;\n}\nelse\n{\n c;\n}')
test_fragment(' /*\n* xx\n*/\n// xx\nif (foo) {\n bar();\n}',
' /*\n * xx\n */\n // xx\n if (foo) {\n bar();\n }')
bt('if (foo)\n{}\nelse /regex/.test();')
test_fragment('if (foo) {')
test_fragment('foo {')
test_fragment('return {') # return needs the brace.
test_fragment('return /* inline */ {')
test_fragment('return;\n{')
bt("throw {}")
bt("throw {\n foo;\n}")
bt('var foo = {}')
bt('function x() {\n foo();\n}zzz', 'function x() {\n foo();\n}\nzzz')
test_fragment('a: do {} while (); xxx', 'a: do {} while ();\nxxx')
bt('{a: do {} while (); xxx}', '{\n a: do {} while ();xxx\n}')
bt('var a = new function() {};')
bt('var a = new function a() {};')
bt('var a = new function()\n{};', 'var a = new function() {};')
bt('var a = new function a()\n{};')
bt('var a = new function a()\n {},\n b = new function b()\n {};')
bt("foo({\n 'a': 1\n},\n10);",
"foo({\n 'a': 1\n },\n 10);")
bt('(["foo","bar"]).each(function(i) {return i;});',
'(["foo", "bar"]).each(function(i) {\n return i;\n});')
bt('(function(i) {return i;})();',
'(function(i) {\n return i;\n})();')
bt( "test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test( /*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
bt( "test(\n" +
"/*Argument 1*/ {\n" +
" 'Value1': '1'\n" +
"},\n" +
"/*Argument 2\n" +
" */ {\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test(\n" +
" /*Argument 1*/\n" +
" {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
bt( "test( /*Argument 1*/\n" +
"{\n" +
" 'Value1': '1'\n" +
"}, /*Argument 2\n" +
" */\n" +
"{\n" +
" 'Value2': '2'\n" +
"});",
# expected
"test( /*Argument 1*/\n" +
" {\n" +
" 'Value1': '1'\n" +
" },\n" +
" /*Argument 2\n" +
" */\n" +
" {\n" +
" 'Value2': '2'\n" +
" });")
# END tests for brace position
 
self.reset_options();
#============================================================
test_fragment('roo = {\n /*\n ****\n FOO\n ****\n */\n BAR: 0\n};')
test_fragment("if (zz) {\n // ....\n}\n(function")
 
self.reset_options();
#============================================================
self.options.preserve_newlines = True;
bt('var a = 42; // foo\n\nvar b;')
bt('var a = 42; // foo\n\n\nvar b;')
bt("var a = 'foo' +\n 'bar';")
bt("var a = \"foo\" +\n \"bar\";")
 
bt('"foo""bar""baz"', '"foo"\n"bar"\n"baz"')
bt("'foo''bar''baz'", "'foo'\n'bar'\n'baz'")
bt("{\n get foo() {}\n}")
bt("{\n var a = get\n foo();\n}")
bt("{\n set foo() {}\n}")
bt("{\n var a = set\n foo();\n}")
bt("var x = {\n get function()\n}")
bt("var x = {\n set function()\n}")
 
# According to my current research get/set have no special meaning outside of an object literal
bt("var x = set\n\na() {}", "var x = set\n\na() {}")
bt("var x = set\n\nfunction() {}", "var x = set\n\nfunction() {}")
 
bt('<!-- foo\nbar();\n-->')
bt('<!-- dont crash') # -->
bt('for () /abc/.test()')
bt('if (k) /aaa/m.test(v) && l();')
bt('switch (true) {\n case /swf/i.test(foo):\n bar();\n}')
bt('createdAt = {\n type: Date,\n default: Date.now\n}')
bt('switch (createdAt) {\n case a:\n Date,\n default:\n Date.now\n}')
 
bt('return function();')
bt('var a = function();')
bt('var a = 5 + function();')
 
bt('{\n foo // something\n ,\n bar // something\n baz\n}')
bt('function a(a) {} function b(b) {} function c(c) {}', 'function a(a) {}\n\nfunction b(b) {}\n\nfunction c(c) {}')
 
 
bt('import foo.*;', 'import foo.*;') # actionscript's import
test_fragment('function f(a: a, b: b)') # actionscript
bt('foo(a, function() {})')
bt('foo(a, /regex/)')
 
bt('/* foo */\n"x"')
 
self.reset_options();
#============================================================
self.options.break_chained_methods = False
self.options.preserve_newlines = False
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat)')
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat);\nfoo.bar().baz().cucumber(fat)')
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat)\nfoo.bar().baz().cucumber(fat)')
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this.something = foo.bar().baz().cucumber(fat)')
bt('this.something.xxx = foo.moo.bar()')
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this.something.xxx = foo.moo.bar()')
 
self.options.break_chained_methods = False
self.options.preserve_newlines = True
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat)')
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat);\nfoo.bar().baz().cucumber(fat)')
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat)\nfoo.bar().baz().cucumber(fat)')
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this\n .something = foo.bar()\n .baz().cucumber(fat)')
bt('this.something.xxx = foo.moo.bar()')
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this\n .something\n .xxx = foo.moo\n .bar()')
 
self.options.break_chained_methods = True
self.options.preserve_newlines = False
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat)')
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat);\nfoo.bar()\n .baz()\n .cucumber(fat)')
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat)\nfoo.bar()\n .baz()\n .cucumber(fat)')
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this.something = foo.bar()\n .baz()\n .cucumber(fat)')
bt('this.something.xxx = foo.moo.bar()')
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this.something.xxx = foo.moo.bar()')
 
self.options.break_chained_methods = True
self.options.preserve_newlines = True
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat)')
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat);\nfoo.bar()\n .baz()\n .cucumber(fat)')
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat)\nfoo.bar()\n .baz()\n .cucumber(fat)')
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this\n .something = foo.bar()\n .baz()\n .cucumber(fat)')
bt('this.something.xxx = foo.moo.bar()')
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this\n .something\n .xxx = foo.moo\n .bar()')
 
self.reset_options();
#============================================================
# Line wrap test intputs
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
wrap_input_1=('foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}')
 
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
wrap_input_2=('{\n' +
' foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
' Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' +
' return between_return_and_expression_should_never_wrap.but_this_can\n' +
' throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
' if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();\n' +
' object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
' }' +
'}')
 
self.options.preserve_newlines = False
self.options.wrap_line_length = 0
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
# expected #
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap.but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_.okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}')
 
self.options.wrap_line_length = 70
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
# expected #
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap.but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_.okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}')
 
self.options.wrap_line_length = 40
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
# expected #
'foo.bar().baz().cucumber((fat &&\n' +
' "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_.okay();\n' +
'object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
'}')
 
self.options.wrap_line_length = 41
# NOTE: wrap is only best effort - line continues until next wrap point is found.
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
# expected #
'foo.bar().baz().cucumber((fat && "sassy") ||\n' +
' (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_.okay();\n' +
'object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
'}')
 
 
self.options.wrap_line_length = 45
# NOTE: wrap is only best effort - line continues until next wrap point is found.
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_2,
# expected #
'{\n' +
' foo.bar().baz().cucumber((fat && "sassy") ||\n' +
' (leans && mean));\n' +
' Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
' return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
' throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
' if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_.okay();\n' +
' object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
' }\n'+
'}')
 
self.options.preserve_newlines = True
self.options.wrap_line_length = 0
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
# expected #
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_\n' +
' .okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}')
 
 
self.options.wrap_line_length = 70
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
# expected #
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap.but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap.but_this_can\n' +
'if (wraps_can_occur && inside_an_if_block) that_is_\n' +
' .okay();\n' +
'object_literal = {\n' +
' propertx: first_token + 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap + but_this_can,\n' +
' propertz: first_token_should_never_wrap + !but_this_can,\n' +
' proper: "first_token_should_never_wrap" + "but_this_can"\n' +
'}')
 
 
self.options.wrap_line_length = 40
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
# expected #
'foo.bar().baz().cucumber((fat &&\n' +
' "sassy") || (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_\n' +
' .okay();\n' +
'object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
'}')
 
self.options.wrap_line_length = 41
# NOTE: wrap is only best effort - line continues until next wrap point is found.
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_1,
# expected #
'foo.bar().baz().cucumber((fat && "sassy") ||\n' +
' (leans && mean));\n' +
'Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
'return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
'if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_\n' +
' .okay();\n' +
'object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
'}')
 
self.options.wrap_line_length = 45
# NOTE: wrap is only best effort - line continues until next wrap point is found.
#..............---------1---------2---------3---------4---------5---------6---------7
#..............1234567890123456789012345678901234567890123456789012345678901234567890
test_fragment(wrap_input_2,
# expected #
'{\n' +
' foo.bar().baz().cucumber((fat && "sassy") ||\n' +
' (leans && mean));\n' +
' Test_very_long_variable_name_this_should_never_wrap\n' +
' .but_this_can\n' +
' return between_return_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
' throw between_throw_and_expression_should_never_wrap\n' +
' .but_this_can\n' +
' if (wraps_can_occur &&\n' +
' inside_an_if_block) that_is_\n' +
' .okay();\n' +
' object_literal = {\n' +
' propertx: first_token +\n' +
' 12345678.99999E-6,\n' +
' property: first_token_should_never_wrap +\n' +
' but_this_can,\n' +
' propertz: first_token_should_never_wrap +\n' +
' !but_this_can,\n' +
' proper: "first_token_should_never_wrap" +\n' +
' "but_this_can"\n' +
' }\n'+
'}')
 
self.reset_options();
#============================================================
self.options.preserve_newlines = False
bt('if (foo) // comment\n bar();')
bt('if (foo) // comment\n (bar());')
bt('if (foo) // comment\n (bar());')
bt('if (foo) // comment\n /asdf/;')
bt('this.oa = new OAuth(\n' +
' _requestToken,\n' +
' _accessToken,\n' +
' consumer_key\n' +
');',
'this.oa = new OAuth(_requestToken, _accessToken, consumer_key);')
bt('foo = {\n x: y, // #44\n w: z // #44\n}')
bt('switch (x) {\n case "a":\n // comment on newline\n break;\n case "b": // comment on same line\n break;\n}')
bt('this.type =\n this.options =\n // comment\n this.enabled null;',
'this.type = this.options =\n // comment\n this.enabled null;')
bt('someObj\n .someFunc1()\n // This comment should not break the indent\n .someFunc2();',
'someObj.someFunc1()\n // This comment should not break the indent\n .someFunc2();')
 
bt('if (true ||\n!true) return;', 'if (true || !true) return;')
 
# these aren't ready yet.
#bt('if (foo) // comment\n bar() /*i*/ + baz() /*j\n*/ + asdf();')
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\na();',
'if (foo)\n if (bar)\n if (baz) whee();\na();')
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\nelse\na();',
'if (foo)\n if (bar)\n if (baz) whee();\n else a();')
bt('if (foo)\nbar();\nelse\ncar();',
'if (foo) bar();\nelse car();')
 
bt('if (foo) if (bar) if (baz);\na();',
'if (foo)\n if (bar)\n if (baz);\na();')
bt('if (foo) if (bar) if (baz) whee();\na();',
'if (foo)\n if (bar)\n if (baz) whee();\na();')
bt('if (foo) a()\nif (bar) if (baz) whee();\na();',
'if (foo) a()\nif (bar)\n if (baz) whee();\na();')
bt('if (foo);\nif (bar) if (baz) whee();\na();',
'if (foo);\nif (bar)\n if (baz) whee();\na();')
bt('if (options)\n' +
' for (var p in options)\n' +
' this[p] = options[p];',
'if (options)\n'+
' for (var p in options) this[p] = options[p];')
bt('if (options) for (var p in options) this[p] = options[p];',
'if (options)\n for (var p in options) this[p] = options[p];')
 
bt('if (options) do q(); while (b());',
'if (options)\n do q(); while (b());')
bt('if (options) while (b()) q();',
'if (options)\n while (b()) q();')
bt('if (options) do while (b()) q(); while (a());',
'if (options)\n do\n while (b()) q(); while (a());')
 
bt('function f(a, b, c,\nd, e) {}',
'function f(a, b, c, d, e) {}')
 
bt('function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}',
'function f(a, b) {\n if (a) b()\n}\n\nfunction g(a, b) {\n if (!a) b()\n}')
bt('function f(a,b) {if(a) b()}\n\n\n\nfunction g(a,b) {if(!a) b()}',
'function f(a, b) {\n if (a) b()\n}\n\nfunction g(a, b) {\n if (!a) b()\n}')
# This is not valid syntax, but still want to behave reasonably and not side-effect
bt('(if(a) b())(if(a) b())',
'(\n if (a) b())(\n if (a) b())')
bt('(if(a) b())\n\n\n(if(a) b())',
'(\n if (a) b())\n(\n if (a) b())')
 
# space between functions
bt('/*\n * foo\n */\nfunction foo() {}')
bt('// a nice function\nfunction foo() {}')
bt('function foo() {}\nfunction foo() {}',
'function foo() {}\n\nfunction foo() {}'
)
 
bt('[\n function() {}\n]')
 
 
bt("if\n(a)\nb();", "if (a) b();")
bt('var a =\nfoo', 'var a = foo')
bt('var a = {\n"a":1,\n"b":2}', "var a = {\n \"a\": 1,\n \"b\": 2\n}")
bt("var a = {\n'a':1,\n'b':2}", "var a = {\n 'a': 1,\n 'b': 2\n}")
bt('var a = /*i*/ "b";')
bt('var a = /*i*/\n"b";', 'var a = /*i*/ "b";')
bt('var a = /*i*/\nb;', 'var a = /*i*/ b;')
bt('{\n\n\n"x"\n}', '{\n "x"\n}')
bt('if(a &&\nb\n||\nc\n||d\n&&\ne) e = f', 'if (a && b || c || d && e) e = f')
bt('if(a &&\n(b\n||\nc\n||d)\n&&\ne) e = f', 'if (a && (b || c || d) && e) e = f')
test_fragment('\n\n"x"', '"x"')
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;',
'a = 1;\nb = 2;')
 
 
self.options.preserve_newlines = True
bt('if (foo) // comment\n bar();')
bt('if (foo) // comment\n (bar());')
bt('if (foo) // comment\n (bar());')
bt('if (foo) // comment\n /asdf/;')
bt('this.oa = new OAuth(\n' +
' _requestToken,\n' +
' _accessToken,\n' +
' consumer_key\n' +
');')
bt('foo = {\n x: y, // #44\n w: z // #44\n}')
bt('switch (x) {\n case "a":\n // comment on newline\n break;\n case "b": // comment on same line\n break;\n}')
bt('this.type =\n this.options =\n // comment\n this.enabled null;')
bt('someObj\n .someFunc1()\n // This comment should not break the indent\n .someFunc2();')
 
bt('if (true ||\n!true) return;', 'if (true ||\n !true) return;')
 
# these aren't ready yet.
# bt('if (foo) // comment\n bar() /*i*/ + baz() /*j\n*/ + asdf();')
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\na();',
'if (foo)\n if (bar)\n if (baz)\n whee();\na();')
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\nelse\na();',
'if (foo)\n if (bar)\n if (baz)\n whee();\n else\n a();')
bt('if (foo)\nbar();\nelse\ncar();',
'if (foo)\n bar();\nelse\n car();')
bt('if (foo) bar();\nelse\ncar();',
'if (foo) bar();\nelse\n car();')
 
bt('if (foo) if (bar) if (baz);\na();',
'if (foo)\n if (bar)\n if (baz);\na();')
bt('if (foo) if (bar) if (baz) whee();\na();',
'if (foo)\n if (bar)\n if (baz) whee();\na();')
bt('if (foo) a()\nif (bar) if (baz) whee();\na();',
'if (foo) a()\nif (bar)\n if (baz) whee();\na();')
bt('if (foo);\nif (bar) if (baz) whee();\na();',
'if (foo);\nif (bar)\n if (baz) whee();\na();')
bt('if (options)\n' +
' for (var p in options)\n' +
' this[p] = options[p];')
bt('if (options) for (var p in options) this[p] = options[p];',
'if (options)\n for (var p in options) this[p] = options[p];')
 
bt('if (options) do q(); while (b());',
'if (options)\n do q(); while (b());')
bt('if (options) do; while (b());',
'if (options)\n do; while (b());')
bt('if (options) while (b()) q();',
'if (options)\n while (b()) q();')
bt('if (options) do while (b()) q(); while (a());',
'if (options)\n do\n while (b()) q(); while (a());')
 
bt('function f(a, b, c,\nd, e) {}',
'function f(a, b, c,\n d, e) {}')
 
bt('function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}',
'function f(a, b) {\n if (a) b()\n}\n\nfunction g(a, b) {\n if (!a) b()\n}')
bt('function f(a,b) {if(a) b()}\n\n\n\nfunction g(a,b) {if(!a) b()}',
'function f(a, b) {\n if (a) b()\n}\n\n\n\nfunction g(a, b) {\n if (!a) b()\n}')
# This is not valid syntax, but still want to behave reasonably and not side-effect
bt('(if(a) b())(if(a) b())',
'(\n if (a) b())(\n if (a) b())')
bt('(if(a) b())\n\n\n(if(a) b())',
'(\n if (a) b())\n\n\n(\n if (a) b())')
 
 
bt("if\n(a)\nb();", "if (a)\n b();")
bt('var a =\nfoo', 'var a =\n foo')
bt('var a = {\n"a":1,\n"b":2}', "var a = {\n \"a\": 1,\n \"b\": 2\n}")
bt("var a = {\n'a':1,\n'b':2}", "var a = {\n 'a': 1,\n 'b': 2\n}")
bt('var a = /*i*/ "b";')
bt('var a = /*i*/\n"b";', 'var a = /*i*/\n "b";')
bt('var a = /*i*/\nb;', 'var a = /*i*/\n b;')
bt('{\n\n\n"x"\n}', '{\n\n\n "x"\n}')
bt('if(a &&\nb\n||\nc\n||d\n&&\ne) e = f', 'if (a &&\n b ||\n c ||\n d &&\n e) e = f')
bt('if(a &&\n(b\n||\nc\n||d)\n&&\ne) e = f', 'if (a &&\n (b ||\n c ||\n d) &&\n e) e = f')
test_fragment('\n\n"x"', '"x"')
# this beavior differs between js and python, defaults to unlimited in js, 10 in python
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;',
'a = 1;\n\n\n\n\n\n\n\n\n\nb = 2;')
self.options.max_preserve_newlines = 8;
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;',
'a = 1;\n\n\n\n\n\n\n\nb = 2;')
 
self.reset_options();
#============================================================
 
 
def decodesto(self, input, expectation=None):
if expectation == None:
expectation = input
 
self.assertMultiLineEqual(
jsbeautifier.beautify(input, self.options), expectation)
 
# if the expected is different from input, run it again
# expected output should be unchanged when run twice.
if not expectation == None:
self.assertMultiLineEqual(
jsbeautifier.beautify(expectation, self.options), expectation)
 
# Everywhere we do newlines, they should be replaced with opts.eol
self.options.eol = '\r\\n';
expectation = expectation.replace('\n', '\r\n')
self.assertMultiLineEqual(
jsbeautifier.beautify(input, self.options), expectation)
if input.find('\n') != -1:
input = input.replace('\n', '\r\n')
self.assertMultiLineEqual(
jsbeautifier.beautify(input, self.options), expectation)
# Ensure support for auto eol detection
self.options.eol = 'auto'
self.assertMultiLineEqual(
jsbeautifier.beautify(input, self.options), expectation)
self.options.eol = '\n'
 
def wrap(self, text):
return self.wrapregex.sub(' \\1', text)
 
def bt(self, input, expectation=None):
if expectation == None:
expectation = input
 
self.decodesto(input, expectation)
# If we set raw, input should be unchanged
self.options.test_output_raw = True
if self.options.end_with_newline:
elf.decodesto(input, input)
self.options.test_output_raw = False
 
current_indent_size = None
if self.options.js and self.options.js['indent_size']:
current_indent_size = self.options.js['indent_size']
 
if not current_indent_size:
current_indent_size = self.options.indent_size
 
if current_indent_size == 4 and input:
wrapped_input = '{\n%s\n foo = bar;\n}' % self.wrap(input)
wrapped_expect = '{\n%s\n foo = bar;\n}' % self.wrap(expectation)
self.decodesto(wrapped_input, wrapped_expect)
 
# If we set raw, input should be unchanged
self.options.test_output_raw = True
if self.options.end_with_newline:
elf.decodesto(wrapped_input, wrapped_input)
self.options.test_output_raw = False
 
 
if __name__ == '__main__':
unittest.main()
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/data/javascript/tests.js
@@ -0,0 +1,3083 @@
/*
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
 
var inputlib = require('./inputlib');
 
exports.test_data = {
default_options: [
{ name: "indent_size", value: "4" },
{ name: "indent_char", value: "' '" },
{ name: "preserve_newlines", value: "true" },
{ name: "jslint_happy", value: "false" },
{ name: "keep_array_indentation", value: "false" },
{ name: "brace_style", value: "'collapse'" },
{ name: "operator_position", value: "'before-newline'" }
],
groups: [{
name: "Unicode Support",
description: "",
tests: [{
unchanged: "var ' + unicode_char(3232) + '_' + unicode_char(3232) + ' = \"hi\";"
}, {
unchanged: [
"var ' + unicode_char(228) + 'x = {",
" ' + unicode_char(228) + 'rgerlich: true",
"};"
]
}]
}, {
name: "Test template and continuation strings",
description: "",
tests: [
{ unchanged: '`This is a ${template} string.`' },
{ unchanged: '`This\n is\n a\n ${template}\n string.`' },
{ unchanged: 'a = `This is a continuation\\\\\nstring.`' },
{ unchanged: 'a = "This is a continuation\\\\\nstring."' },
{ unchanged: '`SELECT\n nextval(\\\'${this.options.schema ? `${this.options.schema}.` : \\\'\\\'}"${this.tableName}_${this.autoIncrementField}_seq"\\\'::regclass\n ) nextval;`' },
{
comment: 'Tests for #1030',
unchanged: [
'const composeUrl = (host) => {',
' return `${host `test`}`;',
'};'
]
}, {
unchanged: [
'const composeUrl = (host, api, key, data) => {',
' switch (api) {',
' case "Init":',
' return `${host}/vwapi/Init?VWID=${key}&DATA=${encodeURIComponent(',
' Object.keys(data).map((k) => `${k}=${ data[k]}` ).join(";")',
' )}`;',
' case "Pay":',
' return `${host}/vwapi/Pay?SessionId=${par}`;',
' };',
'};'
]
}
]
}, {
name: "ES7 Decorators",
description: "Permit ES7 decorators, which are invoked with a leading \"@\".",
tests: [
{ unchanged: '@foo' },
{ unchanged: '@foo(bar)' },
{
unchanged: [
'@foo(function(k, v) {',
' implementation();',
'})'
]
}
]
}, {
name: "ES7 exponential",
description: "ES7 exponential",
tests: [
{ unchanged: 'x ** 2' },
{ unchanged: 'x ** -2' }
]
}, {
name: "Spread operator",
description: "Spread operator",
options: [
{ name: 'brace_style', value: '"collapse,preserve-inline"' }
],
tests: [
{ unchanged: 'const m = { ...item, c: 3 };' },
{ unchanged: 'const m = {\n ...item,\n c: 3\n};' },
{ unchanged: 'const m = { c: 3, ...item };' },
{ unchanged: 'const m = [...item, 3];' },
{ unchanged: 'const m = [3, ...item];' }
]
}, {
name: "Object literal shorthand functions",
description: "Object literal shorthand functions",
tests: [
{ unchanged: 'return {\n foo() {\n return 42;\n }\n}' },
{
unchanged: [
'var foo = {',
' * bar() {',
' yield 42;',
' }',
'};'
]
},
{
input: 'var foo = {bar(){return 42;},*barGen(){yield 42;}};',
output: ['var foo = {',
' bar() {',
' return 42;',
' },',
' * barGen() {',
' yield 42;',
' }',
'};'
]
}, {
comment: 'also handle generator shorthand in class - #1013',
unchanged: [
'class A {',
' fn() {',
' return true;',
' }',
'',
' * gen() {',
' return true;',
' }',
'}'
]
}, {
unchanged: [
'class A {',
' * gen() {',
' return true;',
' }',
'',
' fn() {',
' return true;',
' }',
'}'
]
}
]
}, {
name: "End With Newline",
description: "",
matrix: [{
options: [
{ name: "end_with_newline", value: "true" }
],
eof: '\n'
}, {
options: [
{ name: "end_with_newline", value: "false" }
],
eof: ''
}
 
],
tests: [
{ fragment: true, input: '', output: '{{eof}}' },
{ fragment: true, input: ' return .5', output: ' return .5{{eof}}' },
{ fragment: true, input: ' \n\nreturn .5\n\n\n\n', output: ' return .5{{eof}}' },
{ fragment: true, input: '\n', output: '{{eof}}' }
],
}, {
name: "Support simple language specific option inheritance/overriding",
description: "Support simple language specific option inheritance/overriding",
matrix: [{
options: [
{ name: "js", value: "{ 'indent_size': 3 }" },
{ name: "css", value: "{ 'indent_size': 5 }" }
],
j: ' '
},
{
options: [
{ name: "html", value: "{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 } }" }
],
j: ' '
},
{
options: [
{ name: "indent_size", value: "9" },
{ name: "html", value: "{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 }, 'indent_size': 2}" },
{ name: "js", value: "{ 'indent_size': 4 }" },
{ name: "css", value: "{ 'indent_size': 3 }" }
],
j: ' '
}
],
tests: [{
unchanged: [
'if (a == b) {',
'{{j}}test();',
'}'
]
}, ]
}, {
name: "Brace style permutations",
description: "",
template: "< >",
matrix: [
// brace_style collapse,preserve-inline - Should preserve if no newlines
{
options: [
{ name: "brace_style", value: "'collapse,preserve-inline'" }
],
ibo: '',
iao: '',
ibc: '',
iac: '',
obo: ' ',
oao: ' ',
obc: ' ',
oac: ' '
},
{
options: [
{ name: "brace_style", value: "'collapse,preserve-inline'" }
],
ibo: '\n',
iao: '\n',
ibc: '\n',
iac: '\n',
obo: ' ',
oao: '\n ',
obc: '\n',
oac: ' '
},
 
// brace_style collapse - Shouldn't preserve if no newlines (uses collapse styling)
{
options: [
{ name: "brace_style", value: "'collapse'" }
],
ibo: '',
iao: '',
ibc: '',
iac: '',
obo: ' ',
oao: '\n ',
obc: '\n',
oac: ' '
},
{
options: [
{ name: "brace_style", value: "'collapse'" }
],
ibo: '\n',
iao: '\n',
ibc: '\n',
iac: '\n',
obo: ' ',
oao: '\n ',
obc: '\n',
oac: ' '
},
],
tests: [{
input: 'var a =<ibo>{<iao>a: 2<ibc>}<iac>;\nvar a =<ibo>{<iao>a: 2<ibc>}<iac>;',
output: 'var a =<obo>{<oao>a: 2<obc>};\nvar a =<obo>{<oao>a: 2<obc>};'
},
// {
// input: 'var a =<ibo>{<iao>a:<ibo>{<iao>a:<ibo>{<iao>a:2<ibc>}<iac><ibc>}<iac>}<iac>;\nvar a =<ibo>{<iao>a:<ibo>{<iao>a:<ibo>{<iao>a:2<ibc>}<iac><ibc>}<iac>}<iac>;',
// output: 'var a =<obo>{<oao>a:<obo>{<oao>a:<obo>{<oao>a: 2<obc>}<oac><obc>}<oac><obc>};\nvar a =<obo>{<oao>a:<obo>{<oao>a:<obo>{<oao>a: 2<obc>}<oac><obc>}<oac><obc>};'
// },
{
input: '//case 1\nif (a == 1)<ibo>{}\n//case 2\nelse if (a == 2)<ibo>{}',
output: '//case 1\nif (a == 1)<obo>{}\n//case 2\nelse if (a == 2)<obo>{}'
},
{
input: 'if(1)<ibo>{<iao>2<ibc>}<iac>else<ibo>{<iao>3<ibc>}',
output: 'if (1)<obo>{<oao>2<obc>}<oac>else<obo>{<oao>3<obc>}'
},
{
input: 'try<ibo>{<iao>a();<ibc>}<iac>' +
'catch(b)<ibo>{<iao>c();<ibc>}<iac>' +
'catch(d)<ibo>{}<iac>' +
'finally<ibo>{<iao>e();<ibc>}',
output:
// expected
'try<obo>{<oao>a();<obc>}<oac>' +
'catch (b)<obo>{<oao>c();<obc>}<oac>' +
'catch (d)<obo>{}<oac>' +
'finally<obo>{<oao>e();<obc>}'
}
],
}, {
name: "Comma-first option",
description: "Put commas at the start of lines instead of the end",
matrix: [{
options: [
{ name: "comma_first", value: "false" }
],
c0: ',\n',
c1: ',\n ',
c2: ',\n ',
c3: ',\n ',
// edge cases where engine bails
f1: ' ,\n '
}, {
options: [
{ name: "comma_first", value: "true" }
],
c0: '\n, ',
c1: '\n , ',
c2: '\n , ',
c3: '\n , ',
// edge cases where engine bails
f1: ', '
}],
tests: [
{ input: '{a:1, b:2}', output: "{\n a: 1{{c1}}b: 2\n}" },
{ input: 'var a=1, b=c[d], e=6;', output: 'var a = 1{{c1}}b = c[d]{{c1}}e = 6;' },
{ input: "for(var a=1,b=2,c=3;d<3;d++)\ne", output: "for (var a = 1, b = 2, c = 3; d < 3; d++)\n e" },
{ input: "for(var a=1,b=2,\nc=3;d<3;d++)\ne", output: "for (var a = 1, b = 2{{c2}}c = 3; d < 3; d++)\n e" },
{ unchanged: 'function foo() {\n return [\n "one"{{c2}}"two"\n ];\n}' },
{ input: 'a=[[1,2],[4,5],[7,8]]', output: "a = [\n [1, 2]{{c1}}[4, 5]{{c1}}[7, 8]\n]" },
{ input: 'a=[[1,2],[4,5],[7,8],]', output: "a = [\n [1, 2]{{c1}}[4, 5]{{c1}}[7, 8]{{c0}}]" },
{
input: 'a=[[1,2],[4,5],function(){},[7,8]]',
output: "a = [\n [1, 2]{{c1}}[4, 5]{{c1}}function() {}{{c1}}[7, 8]\n]"
},
{
input: 'a=[[1,2],[4,5],function(){},function(){},[7,8]]',
output: "a = [\n [1, 2]{{c1}}[4, 5]{{c1}}function() {}{{c1}}function() {}{{c1}}[7, 8]\n]"
},
{
input: 'a=[[1,2],[4,5],function(){},[7,8]]',
output: "a = [\n [1, 2]{{c1}}[4, 5]{{c1}}function() {}{{c1}}[7, 8]\n]"
},
{
input: 'a=[b,c,function(){},function(){},d]',
output: "a = [b, c, function() {}, function() {}, d]"
},
{
input: 'a=[b,c,\nfunction(){},function(){},d]',
output: "a = [b, c{{c1}}function() {}{{c1}}function() {}{{c1}}d\n]"
},
{ input: 'a=[a[1],b[4],c[d[7]]]', output: "a = [a[1], b[4], c[d[7]]]" },
{ input: '[1,2,[3,4,[5,6],7],8]', output: "[1, 2, [3, 4, [5, 6], 7], 8]" },
 
{
input: '[[["1","2"],["3","4"]],[["5","6","7"],["8","9","0"]],[["1","2","3"],["4","5","6","7"],["8","9","0"]]]',
output: '[\n [\n ["1", "2"]{{c2}}["3", "4"]\n ]{{c1}}[\n ["5", "6", "7"]{{c2}}["8", "9", "0"]\n ]{{c1}}[\n ["1", "2", "3"]{{c2}}["4", "5", "6", "7"]{{c2}}["8", "9", "0"]\n ]\n]'
},
{
input: [
'changeCollection.add({',
' name: "Jonathan" // New line inserted after this line on every save',
' , age: 25',
'});'
],
output: [
'changeCollection.add({',
' name: "Jonathan" // New line inserted after this line on every save',
' {{f1}}age: 25',
'});'
]
},
{
input: [
'changeCollection.add(',
' function() {',
' return true;',
' },',
' function() {',
' return true;',
' }',
');'
],
output: [
'changeCollection.add(',
' function() {',
' return true;',
' }{{c1}}function() {',
' return true;',
' }',
');'
]
},
],
}, {
name: "Space in parens tests",
description: "put space inside parens",
matrix: [{
options: [
{ name: "space_in_paren", value: "false" },
{ name: "space_in_empty_paren", value: "false" },
],
s: '',
e: '',
}, {
options: [
{ name: "space_in_paren", value: "false" },
{ name: "space_in_empty_paren", value: "true" },
],
s: '',
e: '',
}, {
options: [
{ name: "space_in_paren", value: "true" },
{ name: "space_in_empty_paren", value: "false" },
],
s: ' ',
e: '',
}, {
options: [
{ name: "space_in_paren", value: "true" },
{ name: "space_in_empty_paren", value: "true" },
],
s: ' ',
e: ' ',
}],
tests: [{
input: 'if(p) foo(a,b);',
output: 'if ({{s}}p{{s}}) foo({{s}}a, b{{s}});'
},
{
input: 'try{while(true){willThrow()}}catch(result)switch(result){case 1:++result }',
output: 'try {\n while ({{s}}true{{s}}) {\n willThrow({{e}})\n }\n} catch ({{s}}result{{s}}) switch ({{s}}result{{s}}) {\n case 1:\n ++result\n}'
},
{
input: '((e/((a+(b)*c)-d))^2)*5;',
output: '({{s}}({{s}}e / ({{s}}({{s}}a + ({{s}}b{{s}}) * c{{s}}) - d{{s}}){{s}}) ^ 2{{s}}) * 5;'
},
{
input: 'function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}',
output: 'function f({{s}}a, b{{s}}) {\n if ({{s}}a{{s}}) b({{e}})\n}\n\nfunction g({{s}}a, b{{s}}) {\n if ({{s}}!a{{s}}) b({{e}})\n}'
},
{
input: 'a=[];',
output: 'a = [{{e}}];'
},
{
input: 'a=[b,c,d];',
output: 'a = [{{s}}b, c, d{{s}}];'
},
{
input: 'a= f[b];',
output: 'a = f[{{s}}b{{s}}];'
},
{
input: [
'{',
' files: [ {',
' expand: true,',
' cwd: "www/gui/",',
' src: [ "im/design_standards/*.*" ],',
' dest: "www/gui/build"',
' } ]',
'}'
],
output: [
'{',
' files: [{{s}}{',
' expand: true,',
' cwd: "www/gui/",',
' src: [{{s}}"im/design_standards/*.*"{{s}}],',
' dest: "www/gui/build"',
' }{{s}}]',
'}'
],
},
],
}, {
name: "operator_position option - ensure no neswlines if preserve_newlines is false",
matrix: [{
options: [
{ name: "operator_position", value: "'before-newline'" },
{ name: "preserve_newlines", value: "false" }
]
}, {
options: [
{ name: "operator_position", value: "'after-newline'" },
{ name: "preserve_newlines", value: "false" }
]
}, {
options: [
{ name: "operator_position", value: "'preserve-newline'" },
{ name: "preserve_newlines", value: "false" }
]
}],
tests: [{
unchanged: inputlib.operator_position.sanity
}, {
input: inputlib.operator_position.comprehensive,
output: inputlib.operator_position.sanity,
}]
}, {
name: "operator_position option - set to 'before-newline' (default value)",
tests: [{
comment: 'comprehensive, various newlines',
input: inputlib.operator_position.comprehensive,
output: [
'var res = a + b -',
' c /',
' d * e %',
' f;',
'var res = g & h |',
' i ^',
' j;',
'var res = (k &&',
' l ||',
' m) ?',
' n :',
' o;',
'var res = p >>',
' q <<',
' r >>>',
' s;',
'var res = t',
'',
' ===',
' u !== v !=',
' w ==',
' x >=',
' y <= z > aa <',
' ab;',
'ac +',
' -ad'
]
}, {
comment: 'colon special case',
input: inputlib.operator_position.colon_special_case,
output: [
'var a = {',
' b: bval,',
' c: cval,',
' d: dval',
'};',
'var e = f ? g :',
' h;',
'var i = j ? k :',
' l;'
]
}, {
comment: 'catch-all, includes brackets and other various code',
input: inputlib.operator_position.catch_all,
output: [
'var d = 1;',
'if (a === b &&',
' c) {',
' d = (c * everything /',
' something_else) %',
' b;',
' e',
' += d;',
'',
'} else if (!(complex && simple) ||',
' (emotion && emotion.name === "happy")) {',
' cryTearsOfJoy(many ||',
' anOcean ||',
' aRiver);',
'}'
]
}]
}, {
name: "operator_position option - set to 'after_newline'",
options: [{
name: "operator_position",
value: "'after-newline'"
}],
tests: [{
comment: 'comprehensive, various newlines',
input: inputlib.operator_position.comprehensive,
output: [
'var res = a + b',
' - c',
' / d * e',
' % f;',
'var res = g & h',
' | i',
' ^ j;',
'var res = (k',
' && l',
' || m)',
' ? n',
' : o;',
'var res = p',
' >> q',
' << r',
' >>> s;',
'var res = t',
'',
' === u !== v',
' != w',
' == x',
' >= y <= z > aa',
' < ab;',
'ac',
' + -ad'
]
}, {
comment: 'colon special case',
input: inputlib.operator_position.colon_special_case,
output: [
'var a = {',
' b: bval,',
' c: cval,',
' d: dval',
'};',
'var e = f ? g',
' : h;',
'var i = j ? k',
' : l;'
]
}, {
comment: 'catch-all, includes brackets and other various code',
input: inputlib.operator_position.catch_all,
output: [
'var d = 1;',
'if (a === b',
' && c) {',
' d = (c * everything',
' / something_else)',
' % b;',
' e',
' += d;',
'',
'} else if (!(complex && simple)',
' || (emotion && emotion.name === "happy")) {',
' cryTearsOfJoy(many',
' || anOcean',
' || aRiver);',
'}'
]
}]
}, {
name: "operator_position option - set to 'preserve-newline'",
options: [{
name: "operator_position",
value: "'preserve-newline'"
}],
tests: [{
comment: 'comprehensive, various newlines',
input: inputlib.operator_position.comprehensive,
output: [
'var res = a + b',
' - c /',
' d * e',
' %',
' f;',
'var res = g & h',
' | i ^',
' j;',
'var res = (k &&',
' l',
' || m) ?',
' n',
' : o;',
'var res = p',
' >> q <<',
' r',
' >>> s;',
'var res = t',
'',
' === u !== v',
' !=',
' w',
' == x >=',
' y <= z > aa <',
' ab;',
'ac +',
' -ad'
]
}, {
comment: 'colon special case',
input: inputlib.operator_position.colon_special_case,
output: [
'var a = {',
' b: bval,',
' c: cval,',
' d: dval',
'};',
'var e = f ? g',
' : h;',
'var i = j ? k :',
' l;'
]
}, {
comment: 'catch-all, includes brackets and other various code',
unchanged: inputlib.operator_position.catch_all
}]
}, {
name: "Yield tests",
description: "ES6 yield tests",
tests: [
{ unchanged: 'yield /foo\\\\//;' },
{ unchanged: 'result = yield pgClient.query_(queryString);' },
{ unchanged: 'yield [1, 2]' },
{ unchanged: "yield* bar();" },
{
comment: "yield should have no space between yield and star",
input: "yield * bar();",
output: "yield* bar();"
},
{
comment: "yield should have space between star and generator",
input: "yield *bar();",
output: "yield* bar();"
}
]
}, {
name: "Async / await tests",
description: "ES7 async / await tests",
tests: [
{ unchanged: "async function foo() {}" },
{ unchanged: "let w = async function foo() {}" },
{ unchanged: "async function foo() {}\nvar x = await foo();" },
{
comment: "async function as an input to another function",
unchanged: "wrapper(async function foo() {})"
},
{
comment: "await on inline anonymous function. should have a space after await",
input_: "async function() {\n var w = await(async function() {\n return await foo();\n })();\n}",
output: "async function() {\n var w = await (async function() {\n return await foo();\n })();\n}"
},
{
comment: "ensure that this doesn't break anyone with the async library",
unchanged: "async.map(function(t) {})"
}
]
}, {
name: "e4x - Test that e4x literals passed through when e4x-option is enabled",
description: "",
options: [
{ name: 'e4x', value: true }
],
tests: [
{ input: 'xml=<a b="c"><d/><e>\n foo</e>x</a>;', output: 'xml = <a b="c"><d/><e>\n foo</e>x</a>;' },
{ unchanged: '<a b=\\\'This is a quoted "c".\\\'/>' },
{ unchanged: '<a b="This is a quoted \\\'c\\\'."/>' },
{ unchanged: '<a b="A quote \\\' inside string."/>' },
{ unchanged: '<a b=\\\'A quote " inside string.\\\'/>' },
{ unchanged: '<a b=\\\'Some """ quotes "" inside string.\\\'/>' },
 
{
comment: 'Handles inline expressions',
input: 'xml=<{a} b="c"><d/><e v={z}>\n foo</e>x</{a}>;',
output: 'xml = <{a} b="c"><d/><e v={z}>\n foo</e>x</{a}>;'
},
{
input: 'xml=<{a} b="c">\n <e v={z}>\n foo</e>x</{a}>;',
output: 'xml = <{a} b="c">\n <e v={z}>\n foo</e>x</{a}>;'
},
{
comment: 'xml literals with special characters in elem names - see http://www.w3.org/TR/REC-xml/#NT-NameChar',
unchanged: 'xml = <_:.valid.xml- _:.valid.xml-="123"/>;'
},
{
comment: 'xml literals with attributes without equal sign',
unchanged: 'xml = <elem someAttr/>;'
},
 
{
comment: 'Handles CDATA',
input: 'xml=<![CDATA[ b="c"><d/><e v={z}>\n foo</e>x/]]>;',
output: 'xml = <![CDATA[ b="c"><d/><e v={z}>\n foo</e>x/]]>;'
},
{ input: 'xml=<![CDATA[]]>;', output: 'xml = <![CDATA[]]>;' },
{ input: 'xml=<a b="c"><![CDATA[d/></a></{}]]></a>;', output: 'xml = <a b="c"><![CDATA[d/></a></{}]]></a>;' },
 
{
comment: 'JSX - working jsx from http://prettydiff.com/unit_tests/beautification_javascript_jsx.txt',
unchanged: [
'var ListItem = React.createClass({',
' render: function() {',
' return (',
' <li className="ListItem">',
' <a href={ "/items/" + this.props.item.id }>',
' this.props.item.name',
' </a>',
' </li>',
' );',
' }',
'});'
]
},
{
unchanged: [
'var List = React.createClass({',
' renderList: function() {',
' return this.props.items.map(function(item) {',
' return <ListItem item={item} key={item.id} />;',
' });',
' },',
'',
' render: function() {',
' return <ul className="List">',
' this.renderList()',
' </ul>',
' }',
'});'
]
},
{
unchanged: [
'var Mist = React.createClass({',
' renderList: function() {',
' return this.props.items.map(function(item) {',
' return <ListItem item={return <tag>{item}</tag>} key={item.id} />;',
' });',
' }',
'});',
]
},
{
unchanged: [
'// JSX',
'var box = <Box>',
' {shouldShowAnswer(user) ?',
' <Answer value={false}>no</Answer> : <Box.Comment>',
' Text Content',
' </Box.Comment>}',
' </Box>;',
'var a = function() {',
' return <tsdf>asdf</tsdf>;',
'};',
'',
'var HelloMessage = React.createClass({',
' render: function() {',
' return <div {someAttr}>Hello {this.props.name}</div>;',
' }',
'});',
'React.render(<HelloMessage name="John" />, mountNode);',
]
},
{
unchanged: [
'var Timer = React.createClass({',
' getInitialState: function() {',
' return {',
' secondsElapsed: 0',
' };',
' },',
' tick: function() {',
' this.setState({',
' secondsElapsed: this.state.secondsElapsed + 1',
' });',
' },',
' componentDidMount: function() {',
' this.interval = setInterval(this.tick, 1000);',
' },',
' componentWillUnmount: function() {',
' clearInterval(this.interval);',
' },',
' render: function() {',
' return (',
' <div>Seconds Elapsed: {this.state.secondsElapsed}</div>',
' );',
' }',
'});',
'React.render(<Timer />, mountNode);'
]
},
{
unchanged: [
'var TodoList = React.createClass({',
' render: function() {',
' var createItem = function(itemText) {',
' return <li>{itemText}</li>;',
' };',
' return <ul>{this.props.items.map(createItem)}</ul>;',
' }',
'});'
]
},
{
unchanged: [
'var TodoApp = React.createClass({',
' getInitialState: function() {',
' return {',
' items: [],',
' text: \\\'\\\'',
' };',
' },',
' onChange: function(e) {',
' this.setState({',
' text: e.target.value',
' });',
' },',
' handleSubmit: function(e) {',
' e.preventDefault();',
' var nextItems = this.state.items.concat([this.state.text]);',
' var nextText = \\\'\\\';',
' this.setState({',
' items: nextItems,',
' text: nextText',
' });',
' },',
' render: function() {',
' return (',
' <div>',
' <h3 {someAttr}>TODO</h3>',
' <TodoList items={this.state.items} />',
' <form onSubmit={this.handleSubmit}>',
' <input onChange={this.onChange} value={this.state.text} />',
' <button>{\\\'Add #\\\' + (this.state.items.length + 1)}</button>',
' </form>',
' </div>',
' );',
' }',
'});',
'React.render(<TodoApp />, mountNode);'
]
},
{
input: [
'var converter = new Showdown.converter();',
'var MarkdownEditor = React.createClass({',
' getInitialState: function() {',
' return {value: \\\'Type some *markdown* here!\\\'};',
' },',
' handleChange: function() {',
' this.setState({value: this.refs.textarea.getDOMNode().value});',
' },',
' render: function() {',
' return (',
' <div className="MarkdownEditor">',
' <h3>Input</h3>',
' <textarea',
' onChange={this.handleChange}',
' ref="textarea"',
' defaultValue={this.state.value} />',
' <h3>Output</h3>',
' <div',
' className="content"',
' dangerouslySetInnerHTML={{',
' __html: converter.makeHtml(this.state.value)',
' }}',
' />',
' </div>',
' );',
' }',
'});',
'React.render(<MarkdownEditor />, mountNode);'
 
],
output: [
'var converter = new Showdown.converter();',
'var MarkdownEditor = React.createClass({',
' getInitialState: function() {',
' return {',
' value: \\\'Type some *markdown* here!\\\'',
' };',
' },',
' handleChange: function() {',
' this.setState({',
' value: this.refs.textarea.getDOMNode().value',
' });',
' },',
' render: function() {',
' return (',
' <div className="MarkdownEditor">',
' <h3>Input</h3>',
' <textarea',
' onChange={this.handleChange}',
' ref="textarea"',
' defaultValue={this.state.value} />',
' <h3>Output</h3>',
' <div',
' className="content"',
' dangerouslySetInnerHTML={{',
' __html: converter.makeHtml(this.state.value)',
' }}',
' />',
' </div>',
' );',
' }',
'});',
'React.render(<MarkdownEditor />, mountNode);'
]
},
{
comment: 'JSX - Not quite correct jsx formatting that still works',
input: [
'var content = (',
' <Nav>',
' {/* child comment, put {} around */}',
' <Person',
' /* multi',
' line',
' comment */',
' //attr="test"',
' name={window.isLoggedIn ? window.name : \\\'\\\'} // end of line comment',
' />',
' </Nav>',
' );',
'var qwer = <DropDown> A dropdown list <Menu> <MenuItem>Do Something</MenuItem> <MenuItem>Do Something Fun!</MenuItem> <MenuItem>Do Something Else</MenuItem> </Menu> </DropDown>;',
'render(dropdown);',
],
output: [
'var content = (',
' <Nav>',
' {/* child comment, put {} around */}',
' <Person',
' /* multi',
' line',
' comment */',
' //attr="test"',
' name={window.isLoggedIn ? window.name : \\\'\\\'} // end of line comment',
' />',
' </Nav>',
');',
'var qwer = <DropDown> A dropdown list <Menu> <MenuItem>Do Something</MenuItem> <MenuItem>Do Something Fun!</MenuItem> <MenuItem>Do Something Else</MenuItem> </Menu> </DropDown>;',
'render(dropdown);',
]
},
{
comment: [
"Handles messed up tags, as long as it isn't the same name",
"as the root tag. Also handles tags of same name as root tag",
"as long as nesting matches."
],
input_: 'xml=<a x="jn"><c></b></f><a><d jnj="jnn"><f></a ></nj></a>;',
output: 'xml = <a x="jn"><c></b></f><a><d jnj="jnn"><f></a ></nj></a>;'
},
 
{
comment: [
"If xml is not terminated, the remainder of the file is treated",
"as part of the xml-literal (passed through unaltered)"
],
fragment: true,
input_: 'xml=<a></b>\nc<b;',
output: 'xml = <a></b>\nc<b;'
},
{
comment: 'Issue #646 = whitespace is allowed in attribute declarations',
unchanged: [
'let a = React.createClass({',
' render() {',
' return (',
' <p className=\\\'a\\\'>',
' <span>c</span>',
' </p>',
' );',
' }',
'});'
]
},
{
unchanged: [
'let a = React.createClass({',
' render() {',
' return (',
' <p className = \\\'b\\\'>',
' <span>c</span>',
' </p>',
' );',
' }',
'});'
]
},
{
unchanged: [
'let a = React.createClass({',
' render() {',
' return (',
' <p className = "c">',
' <span>c</span>',
' </p>',
' );',
' }',
'});'
]
},
{
unchanged: [
'let a = React.createClass({',
' render() {',
' return (',
' <{e} className = {d}>',
' <span>c</span>',
' </{e}>',
' );',
' }',
'});'
]
},
{
comment: 'Issue #914 - Multiline attribute in root tag',
unchanged: [
'return (',
' <a href="#"',
' onClick={e => {',
' e.preventDefault()',
' onClick()',
' }}>',
' {children}',
' </a>',
');'
]
},
{
unchanged: [
'return (',
' <{',
' a + b',
' } href="#"',
' onClick={e => {',
' e.preventDefault()',
' onClick()',
' }}>',
' {children}',
' </{',
' a + b',
' }>',
');'
]
},
{
input: [
'return (',
' <{',
' a + b',
' } href="#"',
' onClick={e => {',
' e.preventDefault()',
' onClick()',
' }}>',
' {children}',
' </{a + b}>',
' );'
],
output: [
'return (',
' <{',
' a + b',
' } href="#"',
' onClick={e => {',
' e.preventDefault()',
' onClick()',
' }}>',
' {children}',
' </{a + b}>',
');'
]
}
]
}, {
name: "e4x disabled",
description: "",
options: [
{ name: 'e4x', value: false }
],
tests: [{
input_: 'xml=<a b="c"><d/><e>\n foo</e>x</a>;',
output: 'xml = < a b = "c" > < d / > < e >\n foo < /e>x</a > ;'
}]
}, {
name: "Multiple braces",
description: "",
template: "^^^ $$$",
options: [],
tests: [
{ input: '{{}/z/}', output: '{\n {}\n /z/\n}' }
]
}, {
name: "Beautify preserve formatting",
description: "Allow beautifier to preserve sections",
tests: [
{ unchanged: "/* beautify preserve:start */\n/* beautify preserve:end */" },
{ unchanged: "/* beautify preserve:start */\n var a = 1;\n/* beautify preserve:end */" },
{ unchanged: "var a = 1;\n/* beautify preserve:start */\n var a = 1;\n/* beautify preserve:end */" },
{ unchanged: "/* beautify preserve:start */ {asdklgh;y;;{}dd2d}/* beautify preserve:end */" },
{
input_: "var a = 1;\n/* beautify preserve:start */\n var a = 1;\n/* beautify preserve:end */",
output: "var a = 1;\n/* beautify preserve:start */\n var a = 1;\n/* beautify preserve:end */"
},
{
input_: "var a = 1;\n /* beautify preserve:start */\n var a = 1;\n/* beautify preserve:end */",
output: "var a = 1;\n/* beautify preserve:start */\n var a = 1;\n/* beautify preserve:end */"
},
{
unchanged: [
'var a = {',
' /* beautify preserve:start */',
' one : 1',
' two : 2,',
' three : 3,',
' ten : 10',
' /* beautify preserve:end */',
'};'
]
},
{
input: [
'var a = {',
'/* beautify preserve:start */',
' one : 1,',
' two : 2,',
' three : 3,',
' ten : 10',
'/* beautify preserve:end */',
'};'
],
output: [
'var a = {',
' /* beautify preserve:start */',
' one : 1,',
' two : 2,',
' three : 3,',
' ten : 10',
'/* beautify preserve:end */',
'};'
]
},
{
comment: 'one space before and after required, only single spaces inside.',
input: [
'var a = {',
'/* beautify preserve:start */',
' one : 1,',
' two : 2,',
' three : 3,',
' ten : 10',
'};'
],
output: [
'var a = {',
' /* beautify preserve:start */',
' one: 1,',
' two: 2,',
' three: 3,',
' ten: 10',
'};'
]
},
{
input: [
'var a = {',
'/*beautify preserve:start*/',
' one : 1,',
' two : 2,',
' three : 3,',
' ten : 10',
'};'
],
output: [
'var a = {',
' /*beautify preserve:start*/',
' one: 1,',
' two: 2,',
' three: 3,',
' ten: 10',
'};'
]
},
{
input: [
'var a = {',
'/*beautify preserve:start*/',
' one : 1,',
' two : 2,',
' three : 3,',
' ten : 10',
'};'
],
output: [
'var a = {',
' /*beautify preserve:start*/',
' one: 1,',
' two: 2,',
' three: 3,',
' ten: 10',
'};'
]
},
 
{
comment: 'Directive: ignore',
unchanged: "/* beautify ignore:start */\n/* beautify ignore:end */"
},
{ unchanged: "/* beautify ignore:start */\n var a,,,{ 1;\n/* beautify ignore:end */" },
{ unchanged: "var a = 1;\n/* beautify ignore:start */\n var a = 1;\n/* beautify ignore:end */" },
{ unchanged: "/* beautify ignore:start */ {asdklgh;y;+++;dd2d}/* beautify ignore:end */" },
{
input_: "var a = 1;\n/* beautify ignore:start */\n var a,,,{ 1;\n/* beautify ignore:end */",
output: "var a = 1;\n/* beautify ignore:start */\n var a,,,{ 1;\n/* beautify ignore:end */"
},
{
input_: "var a = 1;\n /* beautify ignore:start */\n var a,,,{ 1;\n/* beautify ignore:end */",
output: "var a = 1;\n/* beautify ignore:start */\n var a,,,{ 1;\n/* beautify ignore:end */"
},
{
unchanged: [
'var a = {',
' /* beautify ignore:start */',
' one : 1',
' two : 2,',
' three : {',
' ten : 10',
' /* beautify ignore:end */',
'};'
]
},
{
input: [
'var a = {',
'/* beautify ignore:start */',
' one : 1',
' two : 2,',
' three : {',
' ten : 10',
'/* beautify ignore:end */',
'};'
],
output: [
'var a = {',
' /* beautify ignore:start */',
' one : 1',
' two : 2,',
' three : {',
' ten : 10',
'/* beautify ignore:end */',
'};'
]
},
{
comment: 'Directives - multiple and interacting',
input: [
'var a = {',
'/* beautify preserve:start */',
'/* beautify preserve:start */',
' one : 1,',
' /* beautify preserve:end */',
' two : 2,',
' three : 3,',
'/* beautify preserve:start */',
' ten : 10',
'/* beautify preserve:end */',
'};'
],
output: [
'var a = {',
' /* beautify preserve:start */',
'/* beautify preserve:start */',
' one : 1,',
' /* beautify preserve:end */',
' two: 2,',
' three: 3,',
' /* beautify preserve:start */',
' ten : 10',
'/* beautify preserve:end */',
'};'
]
},
{
input: [
'var a = {',
'/* beautify ignore:start */',
' one : 1',
' /* beautify ignore:end */',
' two : 2,',
'/* beautify ignore:start */',
' three : {',
' ten : 10',
'/* beautify ignore:end */',
'};'
],
output: [
'var a = {',
' /* beautify ignore:start */',
' one : 1',
' /* beautify ignore:end */',
' two: 2,',
' /* beautify ignore:start */',
' three : {',
' ten : 10',
'/* beautify ignore:end */',
'};'
]
},
{
comment: 'Starts can occur together, ignore:end must occur alone.',
input: [
'var a = {',
'/* beautify ignore:start */',
' one : 1',
' NOTE: ignore end block does not support starting other directives',
' This does not match the ending the ignore...',
' /* beautify ignore:end preserve:start */',
' two : 2,',
'/* beautify ignore:start */',
' three : {',
' ten : 10',
' ==The next comment ends the starting ignore==',
'/* beautify ignore:end */',
'};'
],
output: [
'var a = {',
' /* beautify ignore:start */',
' one : 1',
' NOTE: ignore end block does not support starting other directives',
' This does not match the ending the ignore...',
' /* beautify ignore:end preserve:start */',
' two : 2,',
'/* beautify ignore:start */',
' three : {',
' ten : 10',
' ==The next comment ends the starting ignore==',
'/* beautify ignore:end */',
'};'
]
},
{
input: [
'var a = {',
'/* beautify ignore:start preserve:start */',
' one : {',
' /* beautify ignore:end */',
' two : 2,',
' /* beautify ignore:start */',
' three : {',
'/* beautify ignore:end */',
' ten : 10',
' // This is all preserved',
'};'
],
output: [
'var a = {',
' /* beautify ignore:start preserve:start */',
' one : {',
' /* beautify ignore:end */',
' two : 2,',
' /* beautify ignore:start */',
' three : {',
'/* beautify ignore:end */',
' ten : 10',
' // This is all preserved',
'};'
]
},
{
input: [
'var a = {',
'/* beautify ignore:start preserve:start */',
' one : {',
' /* beautify ignore:end */',
' two : 2,',
' /* beautify ignore:start */',
' three : {',
'/* beautify ignore:end */',
' ten : 10,',
'/* beautify preserve:end */',
' eleven: 11',
'};'
],
output: [
'var a = {',
' /* beautify ignore:start preserve:start */',
' one : {',
' /* beautify ignore:end */',
' two : 2,',
' /* beautify ignore:start */',
' three : {',
'/* beautify ignore:end */',
' ten : 10,',
'/* beautify preserve:end */',
' eleven: 11',
'};'
]
},
]
}, {
name: "Comments and tests",
description: "Comments should be in the right indent and not side-ffect.",
options: [],
tests: [{
comment: '#913',
 
unchanged: [
'class test {',
' method1() {',
' let resp = null;',
' }',
' /**',
' * @param {String} id',
' */',
' method2(id) {',
' let resp2 = null;',
' }',
'}'
]
},
{
comment: '#1090',
unchanged: [
'for (var i = 0; i < 20; ++i) // loop',
' if (i % 3) {',
' console.log(i);',
' }',
'console.log("done");',
]
},
{
comment: '#1043',
unchanged: [
'var o = {',
' k: 0',
'}',
'// ...',
'foo(o)',
]
},
{
comment: '#713 and #964',
unchanged: [
'Meteor.call("foo", bar, function(err, result) {',
' Session.set("baz", result.lorem)',
'})',
'//blah blah',
]
},
{
comment: '#815',
unchanged: [
'foo()',
'// this is a comment',
'bar()',
'',
'const foo = 5',
'// comment',
'bar()',
]
},
{
comment: 'This shows current behavior. Note #1069 is not addressed yet.',
unchanged: [
'if (modulus === 2) {',
' // i might be odd here',
' i += (i & 1);',
' // now i is guaranteed to be even',
' // this block is obviously about the statement above',
'',
' // #1069 This should attach to the block below',
' // this comment is about the block after it.',
'} else {',
' // rounding up using integer arithmetic only',
' if (i % modulus)',
' i += modulus - (i % modulus);',
' // now i is divisible by modulus',
' // behavior of comments should be different for single statements vs block statements/expressions',
'}',
'',
'if (modulus === 2)',
' // i might be odd here',
' i += (i & 1);',
'// now i is guaranteed to be even',
'// non-braced comments unindent immediately',
'',
'// this comment is about the block after it.',
'else',
' // rounding up using integer arithmetic only',
' if (i % modulus)',
' i += modulus - (i % modulus);',
'// behavior of comments should be different for single statements vs block statements/expressions',
]
},
 
]
}, {
name: "Template Formatting",
description: "Php (<?php ... ?>) and underscore.js templating treated as strings.",
options: [],
tests: [
{ unchanged: '<?=$view["name"]; ?>' },
{ unchanged: 'a = <?= external() ?>;' },
{
unchanged: [
'<?php',
'for($i = 1; $i <= 100; $i++;) {',
' #count to 100!',
' echo($i . "</br>");',
'}',
'?>'
]
},
{ unchanged: 'a = <%= external() %>;' }
]
}, {
name: "jslint and space after anon function",
description: "jslint_happy and space_after_anon_function tests",
matrix: [{
options: [
{ name: "jslint_happy", value: "true" },
{ name: "space_after_anon_function", value: "true" }
],
f: ' ',
c: ''
}, {
options: [
{ name: "jslint_happy", value: "true" },
{ name: "space_after_anon_function", value: "false" }
],
f: ' ',
c: ''
}, {
options: [
{ name: "jslint_happy", value: "false" },
{ name: "space_after_anon_function", value: "true" }
],
f: ' ',
c: ' '
}, {
options: [
{ name: "jslint_happy", value: "false" },
{ name: "space_after_anon_function", value: "false" }
],
f: '',
c: ' '
}
 
 
],
tests: [{
input_: 'a=typeof(x)',
output: 'a = typeof{{f}}(x)'
},
{
input_: 'x();\n\nfunction(){}',
output: 'x();\n\nfunction{{f}}() {}'
},
{
input_: 'x();\n\nvar x = {\nx: function(){}\n}',
output: 'x();\n\nvar x = {\n x: function{{f}}() {}\n}'
},
{
input_: 'function () {\n var a, b, c, d, e = [],\n f;\n}',
output: 'function{{f}}() {\n var a, b, c, d, e = [],\n f;\n}'
},
 
{
input_: 'switch(x) {case 0: case 1: a(); break; default: break}',
output: 'switch (x) {\n{{c}}case 0:\n{{c}}case 1:\n{{c}} a();\n{{c}} break;\n{{c}}default:\n{{c}} break\n}'
},
{
input: 'switch(x){case -1:break;case !y:break;}',
output: 'switch (x) {\n{{c}}case -1:\n{{c}} break;\n{{c}}case !y:\n{{c}} break;\n}'
},
{
comment: 'typical greasemonkey start',
fragment: true,
unchanged: '// comment 2\n(function{{f}}()'
},
 
{
input_: 'var a2, b2, c2, d2 = 0, c = function() {}, d = \\\'\\\';',
output: 'var a2, b2, c2, d2 = 0,\n c = function{{f}}() {},\n d = \\\'\\\';'
},
{
input_: 'var a2, b2, c2, d2 = 0, c = function() {},\nd = \\\'\\\';',
output: 'var a2, b2, c2, d2 = 0,\n c = function{{f}}() {},\n d = \\\'\\\';'
},
{
input_: 'var o2=$.extend(a);function(){alert(x);}',
output: 'var o2 = $.extend(a);\n\nfunction{{f}}() {\n alert(x);\n}'
},
{ input: 'function*() {\n yield 1;\n}', output: 'function*{{f}}() {\n yield 1;\n}' },
{ unchanged: 'function* x() {\n yield 1;\n}' },
]
}, {
name: "Regression tests",
description: "Ensure specific bugs do not recur",
options: [],
tests: [{
comment: "Issue 241",
unchanged: [
'obj',
' .last({',
' foo: 1,',
' bar: 2',
' });',
'var test = 1;'
]
},
{
unchanged: [
'obj',
' .last(a, function() {',
' var test;',
' });',
'var test = 1;'
]
},
{
unchanged: [
'obj.first()',
' .second()',
' .last(function(err, response) {',
' console.log(err);',
' });'
]
},
{
comment: "Issue 268 and 275",
unchanged: [
'obj.last(a, function() {',
' var test;',
'});',
'var test = 1;'
]
},
{
unchanged: [
'obj.last(a,',
' function() {',
' var test;',
' });',
'var test = 1;'
]
},
{
input: '(function() {if (!window.FOO) window.FOO || (window.FOO = function() {var b = {bar: "zort"};});})();',
output: [
'(function() {',
' if (!window.FOO) window.FOO || (window.FOO = function() {',
' var b = {',
' bar: "zort"',
' };',
' });',
'})();'
]
},
{
comment: "Issue 281",
unchanged: [
'define(["dojo/_base/declare", "my/Employee", "dijit/form/Button",',
' "dojo/_base/lang", "dojo/Deferred"',
'], function(declare, Employee, Button, lang, Deferred) {',
' return declare(Employee, {',
' constructor: function() {',
' new Button({',
' onClick: lang.hitch(this, function() {',
' new Deferred().then(lang.hitch(this, function() {',
' this.salary * 0.25;',
' }));',
' })',
' });',
' }',
' });',
'});'
]
},
{
unchanged: [
'define(["dojo/_base/declare", "my/Employee", "dijit/form/Button",',
' "dojo/_base/lang", "dojo/Deferred"',
' ],',
' function(declare, Employee, Button, lang, Deferred) {',
' return declare(Employee, {',
' constructor: function() {',
' new Button({',
' onClick: lang.hitch(this, function() {',
' new Deferred().then(lang.hitch(this, function() {',
' this.salary * 0.25;',
' }));',
' })',
' });',
' }',
' });',
' });'
]
},
{
comment: "Issue 459",
unchanged: [
'(function() {',
' return {',
' foo: function() {',
' return "bar";',
' },',
' bar: ["bar"]',
' };',
'}());'
]
},
{
comment: "Issue 505 - strings should end at newline unless continued by backslash",
unchanged: [
'var name = "a;',
'name = "b";'
]
},
{
unchanged: [
'var name = "a;\\\\',
' name = b";'
]
},
{
comment: "Issue 514 - some operators require spaces to distinguish them",
unchanged: 'var c = "_ACTION_TO_NATIVEAPI_" + ++g++ + +new Date;'
},
{
unchanged: 'var c = "_ACTION_TO_NATIVEAPI_" - --g-- - -new Date;'
},
{
comment: "Issue 440 - reserved words can be used as object property names",
unchanged: [
'a = {',
' function: {},',
' "function": {},',
' throw: {},',
' "throw": {},',
' var: {},',
' "var": {},',
' set: {},',
' "set": {},',
' get: {},',
' "get": {},',
' if: {},',
' "if": {},',
' then: {},',
' "then": {},',
' else: {},',
' "else": {},',
' yay: {}',
'};'
]
},
{
comment: "Issue 331 - if-else with braces edge case",
input: 'if(x){a();}else{b();}if(y){c();}',
output: [
'if (x) {',
' a();',
'} else {',
' b();',
'}',
'if (y) {',
' c();',
'}'
]
},
{
comment: "Issue 485 - ensure function declarations behave the same in arrays as elsewhere",
unchanged: [
'var v = ["a",',
' function() {',
' return;',
' }, {',
' id: 1',
' }',
'];'
]
},
{
unchanged: [
'var v = ["a", function() {',
' return;',
'}, {',
' id: 1',
'}];'
]
},
{
comment: "Issue 382 - initial totally cursory support for es6 module export",
unchanged: [
'module "Even" {',
' import odd from "Odd";',
' export function sum(x, y) {',
' return x + y;',
' }',
' export var pi = 3.141593;',
' export default moduleName;',
'}'
]
},
{
unchanged: [
'module "Even" {',
' export default function div(x, y) {}',
'}'
]
},
{
comment: 'Issue 889 - export default { ... }',
unchanged: [
'export default {',
' func1() {},',
' func2() {}',
' func3() {}',
'}'
]
},
{
unchanged: [
'export default {',
' a() {',
' return 1;',
' },',
' b() {',
' return 2;',
' },',
' c() {',
' return 3;',
' }',
'}'
]
},
{
comment: "Issue 508",
unchanged: 'set["name"]'
},
{
unchanged: 'get["name"]'
},
{
fragmeent: true,
unchanged: [
'a = {',
' set b(x) {},',
' c: 1,',
' d: function() {}',
'};'
]
},
{
fragmeent: true,
unchanged: [
'a = {',
' get b() {',
' retun 0;',
' },',
' c: 1,',
' d: function() {}',
'};'
]
},
{
comment: "Issue 298 - do not under indent if/while/for condtionals experesions",
unchanged: [
'\\\'use strict\\\';',
'if ([].some(function() {',
' return false;',
' })) {',
' console.log("hello");',
'}'
]
},
{
comment: "Issue 298 - do not under indent if/while/for condtionals experesions",
unchanged: [
'\\\'use strict\\\';',
'if ([].some(function() {',
' return false;',
' })) {',
' console.log("hello");',
'}'
]
},
{
comment: "Issue 552 - Typescript? Okay... we didn't break it before, so try not to break it now.",
unchanged: [
'class Test {',
' blah: string[];',
' foo(): number {',
' return 0;',
' }',
' bar(): number {',
' return 0;',
' }',
'}'
]
},
{
unchanged: [
'interface Test {',
' blah: string[];',
' foo(): number {',
' return 0;',
' }',
' bar(): number {',
' return 0;',
' }',
'}'
]
},
{
comment: "Issue 583 - Functions with comments after them should still indent correctly.",
unchanged: [
'function exit(code) {',
' setTimeout(function() {',
' phantom.exit(code);',
' }, 0);',
' phantom.onError = function() {};',
'}',
'// Comment'
]
},
{
comment: "Issue 806 - newline arrow functions",
unchanged: [
'a.b("c",',
' () => d.e',
')'
]
},
{
comment: "Issue 810 - es6 object literal detection",
unchanged: [
'function badFormatting() {',
' return {',
' a,',
' b: c,',
' d: e,',
' f: g,',
' h,',
' i,',
' j: k',
' }',
'}',
'',
'function goodFormatting() {',
' return {',
' a: b,',
' c,',
' d: e,',
' f: g,',
' h,',
' i,',
' j: k',
' }',
'}'
]
},
{
comment: "Issue 602 - ES6 object literal shorthand functions",
unchanged: [
'return {',
' fn1() {},',
' fn2() {}',
'}'
]
}, {
unchanged: [
'throw {',
' fn1() {},',
' fn2() {}',
'}'
]
}, {
unchanged: [
'foo({',
' fn1(a) {}',
' fn2(a) {}',
'})'
]
}, {
unchanged: [
'foo("text", {',
' fn1(a) {}',
' fn2(a) {}',
'})'
]
}, {
unchanged: [
'oneArg = {',
' fn1(a) {',
' do();',
' },',
' fn2() {}',
'}'
]
}, {
unchanged: [
'multiArg = {',
' fn1(a, b, c) {',
' do();',
' },',
' fn2() {}',
'}'
]
}, {
unchanged: [
'noArgs = {',
' fn1() {',
' do();',
' },',
' fn2() {}',
'}'
]
}, {
unchanged: [
'emptyFn = {',
' fn1() {},',
' fn2() {}',
'}'
]
}, {
unchanged: [
'nested = {',
' fns: {',
' fn1() {},',
' fn2() {}',
' }',
'}'
]
}, {
unchanged: [
'array = [{',
' fn1() {},',
' prop: val,',
' fn2() {}',
'}]'
]
}, {
unchanged: [
'expr = expr ? expr : {',
' fn1() {},',
' fn2() {}',
'}'
]
}, {
unchanged: [
'strange = valid + {',
' fn1() {},',
' fn2() {',
' return 1;',
' }',
'}.fn2()'
]
},
{
comment: "Issue 854 - Arrow function with statement block",
unchanged: [
'test(() => {',
' var a = {}',
'',
' a.what = () => true ? 1 : 2',
'',
' a.thing = () => {',
' b();',
' }',
'})'
]
},
{
comment: "Issue 406 - Multiline array",
unchanged: [
'var tempName = [',
' "temp",',
' process.pid,',
' (Math.random() * 0x1000000000).toString(36),',
' new Date().getTime()',
'].join("-");'
]
},
{
comment: "Issue #996 - Input ends with backslash throws exception",
fragment: true,
unchanged: [
'sd = 1;',
'/'
]
},
{
comment: "Issue #1079 - unbraced if with comments should still look right",
unchanged: [
'if (console.log)',
' for (var i = 0; i < 20; ++i)',
' if (i % 3)',
' console.log(i);',
'// all done',
'console.log("done");'
]
},
{
comment: "Issue #1085 - function should not have blank line in a number of cases",
unchanged: [
'var transformer =',
' options.transformer ||',
' globalSettings.transformer ||',
' function(x) {',
' return x;',
' };'
]
},
{
comment: "Issue #569 - function should not have blank line in a number of cases",
unchanged: [
'(function(global) {',
' "use strict";',
'',
' /* jshint ignore:start */',
' include "somefile.js"',
' /* jshint ignore:end */',
'}(this));'
]
},
{
unchanged: [
'function bindAuthEvent(eventName) {',
' self.auth.on(eventName, function(event, meta) {',
' self.emit(eventName, event, meta);',
' });',
'}',
'["logged_in", "logged_out", "signed_up", "updated_user"].forEach(bindAuthEvent);',
'',
'function bindBrowserEvent(eventName) {',
' browser.on(eventName, function(event, meta) {',
' self.emit(eventName, event, meta);',
' });',
'}',
'["navigating"].forEach(bindBrowserEvent);'
]
},
{
comment: "Issue #892 - new line between chained methods ",
unchanged: [
'foo',
' .who()',
'',
' .knows()',
' // comment',
' .nothing() // comment',
'',
' .more()'
]
}
]
}, {
name: "Test non-positionable-ops",
description: "Ensure specific bugs do not recur",
tests: [
{ unchanged: 'a += 2;' },
{ unchanged: 'a -= 2;' },
{ unchanged: 'a *= 2;' },
{ unchanged: 'a /= 2;' },
{ unchanged: 'a %= 2;' },
{ unchanged: 'a &= 2;' },
{ unchanged: 'a ^= 2;' },
{ unchanged: 'a |= 2;' },
{ unchanged: 'a **= 2;' },
{ unchanged: 'a <<= 2;' },
{ unchanged: 'a >>= 2;' },
]
}, {
//Relies on the tab being four spaces as default for the tests
name: "brace_style ,preserve-inline tests",
description: "brace_style *,preserve-inline varying different brace_styles",
template: "< >",
matrix: [
//test for all options of brace_style
{
options: [
{ name: "brace_style", value: "'collapse,preserve-inline'" }
],
obo: ' ',
obot: '', //Output Before Open curlybrace & Tab character
oao: '\n',
oaot: ' ', //Output After Open curlybrace & corresponding Tab
obc: '\n', //Output Before Close curlybrace
oac: ' ',
oact: '' //Output After Close curlybrace & corresponding Tab character
},
{
options: [
{ name: "brace_style", value: "'expand,preserve-inline'" }
],
obo: '\n',
obot: ' ',
oao: '\n',
oaot: ' ',
obc: '\n',
oac: '\n',
oact: ' '
},
{
options: [
{ name: "brace_style", value: "'end-expand,preserve-inline'" }
],
obo: ' ',
obot: '',
oao: '\n',
oaot: ' ',
obc: '\n',
oac: '\n',
oact: ' '
},
{
//None tries not to touch brace style so all the tests in this
//matrix were formatted as if they were collapse
options: [
{ name: "brace_style", value: "'none,preserve-inline'" }
],
obo: ' ',
obot: '',
oao: '\n',
oaot: ' ',
obc: '\n',
oac: ' ',
oact: ''
},
//Test for backward compatibility
{
options: [
{ name: "brace_style", value: "'collapse-preserve-inline'" }
],
//Equivalent to the output of the first test
obo: ' ',
obot: '',
oao: '\n',
oaot: ' ',
obc: '\n',
oac: ' ',
oact: ''
}
],
tests: [
//Test single inline blocks
{
unchanged: 'import { asdf } from "asdf";'
},
{
unchanged: 'import { get } from "asdf";'
},
{
unchanged: 'function inLine() { console.log("oh em gee"); }'
},
{
unchanged: 'if (cancer) { console.log("Im sorry but you only have so long to live..."); }'
},
//Test more complex inliners
{
input: 'if (ding) { console.log("dong"); } else { console.log("dang"); }',
output: 'if (ding) { console.log("dong"); }<oac>else { console.log("dang"); }'
},
//Test complex mixes of the two
{
//The outer function and the third object (obj3) should not
//be preserved. All other objects should be
input: [
'function kindaComplex() {',
' var a = 2;',
' var obj = {};',
' var obj2 = { a: "a", b: "b" };',
' var obj3 = {',
' c: "c",',
' d: "d",',
' e: "e"',
' };',
'}'
],
output: [
'function kindaComplex()<obo>{<oao>' + //NL in templates
'<oaot>var a = 2;',
' var obj = {};',
' var obj2 = { a: "a", b: "b" };',
' var obj3 = {<oao>' + //NL in templates, Expand doesnt affect js objects
'<oaot><oaot>c: "c",',
' d: "d",',
' e: "e"' + //NL in templates
'<obc> };' + //NL in templates
'<obc>}'
]
},
{
//All inlines should be preserved, all non-inlines (specifically
//complex(), obj, and obj.b should not be preserved (and hence
//have the template spacing defined in output)
input: [
'function complex() {',
' console.log("wowe");',
' (function() { var a = 2; var b = 3; })();',
' $.each(arr, function(el, idx) { return el; });',
' var obj = {',
' a: function() { console.log("test"); },',
' b() {',
' console.log("test2");',
' }',
' };',
'}'
 
],
output: [
'function complex()<obo>{<oao>' + //NL in templates
'<oaot>console.log("wowe");',
' (function() { var a = 2; var b = 3; })();',
' $.each(arr, function(el, idx) { return el; });',
' var obj = {<oao>' + //NL in templates
'<oaot><oaot>a: function() { console.log("test"); },',
' b()<obo><obot><obot>{<oao>' + //NL in templates
'<oaot><oaot><oaot>console.log("test2");' +
'<obc> }' + //NL in templates
'<obc> };' + //NL in templates
'<obc>}'
]
}
]
}, {
name: "Destructured and related",
description: "Ensure specific bugs do not recur",
options: [
{ name: "brace_style", value: "'collapse,preserve-inline'" }
], //Issue 1052, now collapse,preserve-inline instead of collapse-preserve-inline
tests: [{
comment: "Issue 382 - import destructured ",
unchanged: [
'module "Even" {',
' import { odd, oddly } from "Odd";',
'}'
]
},
{
unchanged: [
'import defaultMember from "module-name";',
'import * as name from "module-name";',
'import { member } from "module-name";',
'import { member as alias } from "module-name";',
'import { member1, member2 } from "module-name";',
'import { member1, member2 as alias2 } from "module-name";',
'import defaultMember, { member, member2 } from "module-name";',
'import defaultMember, * as name from "module-name";',
'import "module-name";'
]
},
{
comment: "Issue 858 - from is a keyword only after import",
unchanged: [
'if (from < to) {',
' from++;',
'} else {',
' from--;',
'}'
]
},
{
comment: "Issue 511 - destrutured",
unchanged: [
'var { b, c } = require("../stores");',
'var { ProjectStore } = require("../stores");',
'',
'function takeThing({ prop }) {',
' console.log("inner prop", prop)',
'}'
]
},
{
comment: "Issue 315 - Short objects",
unchanged: [
'var a = { b: { c: { d: e } } };'
]
},
{
unchanged: [
'var a = {',
' b: {',
' c: { d: e }',
' c3: { d: e }',
' },',
' b2: { c: { d: e } }',
'};'
]
},
{
comment: "Issue 370 - Short objects in array",
unchanged: [
'var methods = [',
' { name: "to" },',
' { name: "step" },',
' { name: "move" },',
' { name: "min" },',
' { name: "max" }',
'];'
]
},
{
comment: "Issue 838 - Short objects in array",
unchanged: [
'function(url, callback) {',
' var script = document.createElement("script")',
' if (true) script.onreadystatechange = function() {',
' foo();',
' }',
' else script.onload = callback;',
'}'
]
},
{
comment: "Issue 578 - Odd indenting after function",
unchanged: [
'function bindAuthEvent(eventName) {',
' self.auth.on(eventName, function(event, meta) {',
' self.emit(eventName, event, meta);',
' });',
'}',
'["logged_in", "logged_out", "signed_up", "updated_user"].forEach(bindAuthEvent);',
]
},
{
comment: "Issue #487 - some short expressions examples",
unchanged: [
'if (a == 1) { a++; }',
'a = { a: a };',
'UserDB.findOne({ username: "xyz" }, function(err, user) {});',
'import { fs } from "fs";'
]
},
{
comment: "Issue #982 - Fixed return expression collapse-preserve-inline",
unchanged: [
'function foo(arg) {',
' if (!arg) { a(); }',
' if (!arg) { return false; }',
' if (!arg) { throw "inline"; }',
' return true;',
'}'
]
},
{
comment: "Issue #338 - Short expressions ",
unchanged: [
'if (someCondition) { return something; }',
'if (someCondition) {',
' return something;',
'}',
'if (someCondition) { break; }',
'if (someCondition) {',
' return something;',
'}'
]
}
]
}, {
// =======================================================
// New tests groups should be added above this line.
// Everything below is a work in progress - converting
// old test to generated form.
// =======================================================
name: "Old tests",
description: "Largely unorganized pile of tests",
options: [],
tests: [
{ unchanged: '' },
{ fragment: true, unchanged: ' return .5' },
{ fragment: true, unchanged: ' return .5;\n a();' },
{ fragment: true, unchanged: ' return .5;\n a();' },
{ fragment: true, unchanged: ' return .5;\n a();' },
{ fragment: true, unchanged: ' < div' },
{ input: 'a = 1', output: 'a = 1' },
{ input: 'a=1', output: 'a = 1' },
{ unchanged: '(3) / 2' },
{ unchanged: '["a", "b"].join("")' },
{ unchanged: 'a();\n\nb();' },
{ input: 'var a = 1 var b = 2', output: 'var a = 1\nvar b = 2' },
{ input: 'var a=1, b=c[d], e=6;', output: 'var a = 1,\n b = c[d],\n e = 6;' },
{ unchanged: 'var a,\n b,\n c;' },
{ input: 'let a = 1 let b = 2', output: 'let a = 1\nlet b = 2' },
{ input: 'let a=1, b=c[d], e=6;', output: 'let a = 1,\n b = c[d],\n e = 6;' },
{ unchanged: 'let a,\n b,\n c;' },
{ input: 'const a = 1 const b = 2', output: 'const a = 1\nconst b = 2' },
{ input: 'const a=1, b=c[d], e=6;', output: 'const a = 1,\n b = c[d],\n e = 6;' },
{ unchanged: 'const a,\n b,\n c;' },
{ unchanged: 'a = " 12345 "' },
{ unchanged: "a = \\' 12345 \\'" },
{ unchanged: 'if (a == 1) b = 2;' },
{ input: 'if(1){2}else{3}', output: 'if (1) {\n 2\n} else {\n 3\n}' },
{ input: 'if(1||2);', output: 'if (1 || 2);' },
{ input: '(a==1)||(b==2)', output: '(a == 1) || (b == 2)' },
{ input: 'var a = 1 if (2) 3;', output: 'var a = 1\nif (2) 3;' },
{ unchanged: 'a = a + 1' },
{ unchanged: 'a = a == 1' },
{ unchanged: '/12345[^678]*9+/.match(a)' },
{ unchanged: 'a /= 5' },
{ unchanged: 'a = 0.5 * 3' },
{ unchanged: 'a *= 10.55' },
{ unchanged: 'a < .5' },
{ unchanged: 'a <= .5' },
{ input: 'a<.5', output: 'a < .5' },
{ input: 'a<=.5', output: 'a <= .5' },
 
{
comment: 'exponent literals',
unchanged: 'a = 1e10'
},
{ unchanged: 'a = 1.3e10' },
{ unchanged: 'a = 1.3e-10' },
{ unchanged: 'a = -12345.3e-10' },
{ unchanged: 'a = .12345e-10' },
{ unchanged: 'a = 06789e-10' },
{ unchanged: 'a = e - 10' },
{ unchanged: 'a = 1.3e+10' },
{ unchanged: 'a = 1.e-7' },
{ unchanged: 'a = -12345.3e+10' },
{ unchanged: 'a = .12345e+10' },
{ unchanged: 'a = 06789e+10' },
{ unchanged: 'a = e + 10' },
{ input: 'a=0e-12345.3e-10', output: 'a = 0e-12345 .3e-10' },
{ input: 'a=0.e-12345.3e-10', output: 'a = 0.e-12345 .3e-10' },
{ input: 'a=0x.e-12345.3e-10', output: 'a = 0x.e - 12345.3e-10' },
{ input: 'a=0x0.e-12345.3e-10', output: 'a = 0x0.e - 12345.3e-10' },
{ input: 'a=0x0.0e-12345.3e-10', output: 'a = 0x0 .0e-12345 .3e-10' },
{ input: 'a=0g-12345.3e-10', output: 'a = 0 g - 12345.3e-10' },
{ input: 'a=0.g-12345.3e-10', output: 'a = 0. g - 12345.3e-10' },
{ input: 'a=0x.g-12345.3e-10', output: 'a = 0x.g - 12345.3e-10' },
{ input: 'a=0x0.g-12345.3e-10', output: 'a = 0x0.g - 12345.3e-10' },
{ input: 'a=0x0.0g-12345.3e-10', output: 'a = 0x0 .0 g - 12345.3e-10' },
 
{
comment: 'Decimal literals',
unchanged: 'a = 0123456789;'
},
{ unchanged: 'a = 9876543210;' },
{ unchanged: 'a = 5647308291;' },
{ input: 'a=030e-5', output: 'a = 030e-5' },
{ input: 'a=00+4', output: 'a = 00 + 4' },
{ input: 'a=32+4', output: 'a = 32 + 4' },
{ input: 'a=0.6g+4', output: 'a = 0.6 g + 4' },
{ input: 'a=01.10', output: 'a = 01.10' },
{ input: 'a=a.10', output: 'a = a .10' },
{ input: 'a=00B0x0', output: 'a = 00 B0x0' },
{ input: 'a=00B0xb0', output: 'a = 00 B0xb0' },
{ input: 'a=00B0x0b0', output: 'a = 00 B0x0b0' },
{ input: 'a=0090x0', output: 'a = 0090 x0' },
{ input: 'a=0g0b0o0', output: 'a = 0 g0b0o0' },
 
{
comment: 'Hexadecimal literals',
unchanged: 'a = 0x0123456789abcdef;'
},
{ unchanged: 'a = 0X0123456789ABCDEF;' },
{ unchanged: 'a = 0xFeDcBa9876543210;' },
{ input: 'a=0x30e-5', output: 'a = 0x30e - 5' },
{ input: 'a=0xF0+4', output: 'a = 0xF0 + 4' },
{ input: 'a=0Xff+4', output: 'a = 0Xff + 4' },
{ input: 'a=0Xffg+4', output: 'a = 0Xff g + 4' },
{ input: 'a=0x01.10', output: 'a = 0x01 .10' },
{ unchanged: 'a = 0xb0ce;' },
{ unchanged: 'a = 0x0b0;' },
{ input: 'a=0x0B0x0', output: 'a = 0x0B0 x0' },
{ input: 'a=0x0B0xb0', output: 'a = 0x0B0 xb0' },
{ input: 'a=0x0B0x0b0', output: 'a = 0x0B0 x0b0' },
{ input: 'a=0X090x0', output: 'a = 0X090 x0' },
{ input: 'a=0Xg0b0o0', output: 'a = 0X g0b0o0' },
 
{
comment: 'Octal literals',
unchanged: 'a = 0o01234567;'
},
{ unchanged: 'a = 0O01234567;' },
{ unchanged: 'a = 0o34120675;' },
{ input: 'a=0o30e-5', output: 'a = 0o30 e - 5' },
{ input: 'a=0o70+4', output: 'a = 0o70 + 4' },
{ input: 'a=0O77+4', output: 'a = 0O77 + 4' },
{ input: 'a=0O778+4', output: 'a = 0O77 8 + 4' },
{ input: 'a=0O77a+4', output: 'a = 0O77 a + 4' },
{ input: 'a=0o01.10', output: 'a = 0o01 .10' },
{ input: 'a=0o0B0x0', output: 'a = 0o0 B0x0' },
{ input: 'a=0o0B0xb0', output: 'a = 0o0 B0xb0' },
{ input: 'a=0o0B0x0b0', output: 'a = 0o0 B0x0b0' },
{ input: 'a=0O090x0', output: 'a = 0O0 90 x0' },
{ input: 'a=0Og0b0o0', output: 'a = 0O g0b0o0' },
 
{
comment: 'Binary literals',
unchanged: 'a = 0b010011;'
},
{ unchanged: 'a = 0B010011;' },
{ unchanged: 'a = 0b01001100001111;' },
{ input: 'a=0b10e-5', output: 'a = 0b10 e - 5' },
{ input: 'a=0b10+4', output: 'a = 0b10 + 4' },
{ input: 'a=0B11+4', output: 'a = 0B11 + 4' },
{ input: 'a=0B112+4', output: 'a = 0B11 2 + 4' },
{ input: 'a=0B11a+4', output: 'a = 0B11 a + 4' },
{ input: 'a=0b01.10', output: 'a = 0b01 .10' },
{ input: 'a=0b0B0x0', output: 'a = 0b0 B0x0' },
{ input: 'a=0b0B0xb0', output: 'a = 0b0 B0xb0' },
{ input: 'a=0b0B0x0b0', output: 'a = 0b0 B0x0b0' },
{ input: 'a=0B090x0', output: 'a = 0B0 90 x0' },
{ input: 'a=0Bg0b0o0', output: 'a = 0B g0b0o0' },
{ unchanged: 'a = [1, 2, 3, 4]' },
{ input: 'F*(g/=f)*g+b', output: 'F * (g /= f) * g + b' },
{ input: 'a.b({c:d})', output: 'a.b({\n c: d\n})' },
{ input: 'a.b\n(\n{\nc:\nd\n}\n)', output: 'a.b({\n c: d\n})' },
{ input: 'a.b({c:"d"})', output: 'a.b({\n c: "d"\n})' },
{ input: 'a.b\n(\n{\nc:\n"d"\n}\n)', output: 'a.b({\n c: "d"\n})' },
{ input: 'a=!b', output: 'a = !b' },
{ input: 'a=!!b', output: 'a = !!b' },
{ input: 'a?b:c', output: 'a ? b : c' },
{ input: 'a?1:2', output: 'a ? 1 : 2' },
{ input: 'a?(b):c', output: 'a ? (b) : c' },
{ input: 'x={a:1,b:w=="foo"?x:y,c:z}', output: 'x = {\n a: 1,\n b: w == "foo" ? x : y,\n c: z\n}' },
{ input: 'x=a?b?c?d:e:f:g;', output: 'x = a ? b ? c ? d : e : f : g;' },
{ input: 'x=a?b?c?d:{e1:1,e2:2}:f:g;', output: 'x = a ? b ? c ? d : {\n e1: 1,\n e2: 2\n} : f : g;' },
{ unchanged: 'function void(void) {}' },
{ input: 'if(!a)foo();', output: 'if (!a) foo();' },
{ input: 'a=~a', output: 'a = ~a' },
{ input: 'a;/*comment*/b;', output: "a; /*comment*/\nb;" },
{ input: 'a;/* comment */b;', output: "a; /* comment */\nb;" },
{ fragment: true, input: 'a;/*\ncomment\n*/b;', output: "a;\n/*\ncomment\n*/\nb;", comment: "simple comments don't get touched at all" },
{ input: 'a;/**\n* javadoc\n*/b;', output: "a;\n/**\n * javadoc\n */\nb;" },
{ fragment: true, input: 'a;/**\n\nno javadoc\n*/b;', output: "a;\n/**\n\nno javadoc\n*/\nb;" },
{ input: 'a;/*\n* javadoc\n*/b;', output: "a;\n/*\n * javadoc\n */\nb;", comment: 'comment blocks detected and reindented even w/o javadoc starter' },
{ input: 'if(a)break;', output: "if (a) break;" },
{ input: 'if(a){break}', output: "if (a) {\n break\n}" },
{ input: 'if((a))foo();', output: 'if ((a)) foo();' },
{ input: 'for(var i=0;;) a', output: 'for (var i = 0;;) a' },
{ input: 'for(var i=0;;)\na', output: 'for (var i = 0;;)\n a' },
{ unchanged: 'a++;' },
{ input: 'for(;;i++)a()', output: 'for (;; i++) a()' },
{ input: 'for(;;i++)\na()', output: 'for (;; i++)\n a()' },
{ input: 'for(;;++i)a', output: 'for (;; ++i) a' },
{ input: 'return(1)', output: 'return (1)' },
{ input: 'try{a();}catch(b){c();}finally{d();}', output: "try {\n a();\n} catch (b) {\n c();\n} finally {\n d();\n}" },
{ unchanged: '(xx)()', comment: ' magic function call' },
{ unchanged: 'a[1]()', comment: 'another magic function call' },
{ input: 'if(a){b();}else if(c) foo();', output: "if (a) {\n b();\n} else if (c) foo();" },
{ input: 'switch(x) {case 0: case 1: a(); break; default: break}', output: "switch (x) {\n case 0:\n case 1:\n a();\n break;\n default:\n break\n}" },
{ input: 'switch(x){case -1:break;case !y:break;}', output: 'switch (x) {\n case -1:\n break;\n case !y:\n break;\n}' },
{ unchanged: 'a !== b' },
{ input: 'if (a) b(); else c();', output: "if (a) b();\nelse c();" },
{ unchanged: "// comment\n(function something() {})", comment: 'typical greasemonkey start' },
{ unchanged: "{\n\n x();\n\n}", comment: 'duplicating newlines' },
{ unchanged: 'if (a in b) foo();' },
{ unchanged: 'if (a of b) foo();' },
{ unchanged: 'if (a of [1, 2, 3]) foo();' },
{
input: 'if(X)if(Y)a();else b();else c();',
output: "if (X)\n if (Y) a();\n else b();\nelse c();"
},
{ unchanged: 'if (foo) bar();\nelse break' },
{ unchanged: 'var a, b;' },
{ unchanged: 'var a = new function();' },
{ fragment: true, unchanged: 'new function' },
{ unchanged: 'var a, b' },
{ input: '{a:1, b:2}', output: "{\n a: 1,\n b: 2\n}" },
{ input: 'a={1:[-1],2:[+1]}', output: 'a = {\n 1: [-1],\n 2: [+1]\n}' },
{ input: "var l = {\\'a\\':\\'1\\', \\'b\\':\\'2\\'}", output: "var l = {\n \\'a\\': \\'1\\',\n \\'b\\': \\'2\\'\n}" },
{ unchanged: 'if (template.user[n] in bk) foo();' },
{ unchanged: 'return 45' },
{ unchanged: 'return this.prevObject ||\n\n this.constructor(null);' },
{ unchanged: 'If[1]' },
{ unchanged: 'Then[1]' },
{ input: "a = 1;// comment", output: "a = 1; // comment" },
{ unchanged: "a = 1; // comment" },
{ input: "a = 1;\n // comment", output: "a = 1;\n// comment" },
{ unchanged: 'a = [-1, -1, -1]' },
 
// These must work as non-fragments.
{ unchanged: ['// a', '// b', '', '', '', '// c', '// d'] },
{ unchanged: ['// func-comment', '', 'function foo() {}', '', '// end-func-comment'] },
 
{
comment: 'The exact formatting these should have is open for discussion, but they are at least reasonable',
unchanged: 'a = [ // comment\n -1, -1, -1\n]'
},
{ unchanged: 'var a = [ // comment\n -1, -1, -1\n]' },
{ unchanged: 'a = [ // comment\n -1, // comment\n -1, -1\n]' },
{ unchanged: 'var a = [ // comment\n -1, // comment\n -1, -1\n]' },
 
{ input: 'o = [{a:b},{c:d}]', output: 'o = [{\n a: b\n}, {\n c: d\n}]' },
 
{
comment: 'was: extra space appended',
unchanged: "if (a) {\n do();\n}"
},
 
{
comment: 'if/else statement with empty body',
input: "if (a) {\n// comment\n}else{\n// comment\n}",
output: "if (a) {\n // comment\n} else {\n // comment\n}"
},
{ comment: 'multiple comments indentation', input: "if (a) {\n// comment\n// comment\n}", output: "if (a) {\n // comment\n // comment\n}" },
{ input: "if (a) b() else c();", output: "if (a) b()\nelse c();" },
{ input: "if (a) b() else if c() d();", output: "if (a) b()\nelse if c() d();" },
 
{ unchanged: "{}" },
{ unchanged: "{\n\n}" },
{ input: "do { a(); } while ( 1 );", output: "do {\n a();\n} while (1);" },
{ unchanged: "do {} while (1);" },
{ input: "do {\n} while (1);", output: "do {} while (1);" },
{ unchanged: "do {\n\n} while (1);" },
{ unchanged: "var a = x(a, b, c)" },
{ input: "delete x if (a) b();", output: "delete x\nif (a) b();" },
{ input: "delete x[x] if (a) b();", output: "delete x[x]\nif (a) b();" },
{ input: "for(var a=1,b=2)d", output: "for (var a = 1, b = 2) d" },
{ input: "for(var a=1,b=2,c=3) d", output: "for (var a = 1, b = 2, c = 3) d" },
{ input: "for(var a=1,b=2,c=3;d<3;d++)\ne", output: "for (var a = 1, b = 2, c = 3; d < 3; d++)\n e" },
{ input: "function x(){(a||b).c()}", output: "function x() {\n (a || b).c()\n}" },
{ input: "function x(){return - 1}", output: "function x() {\n return -1\n}" },
{ input: "function x(){return ! a}", output: "function x() {\n return !a\n}" },
{ unchanged: "x => x" },
{ unchanged: "(x) => x" },
{ input: "x => { x }", output: "x => {\n x\n}" },
{ input: "(x) => { x }", output: "(x) => {\n x\n}" },
 
{
comment: 'a common snippet in jQuery plugins',
input_: "settings = $.extend({},defaults,settings);",
output: "settings = $.extend({}, defaults, settings);"
},
 
// reserved words used as property names
{ unchanged: "$http().then().finally().default()" },
{ input: "$http()\n.then()\n.finally()\n.default()", output: "$http()\n .then()\n .finally()\n .default()" },
{ unchanged: "$http().when.in.new.catch().throw()" },
{ input: "$http()\n.when\n.in\n.new\n.catch()\n.throw()", output: "$http()\n .when\n .in\n .new\n .catch()\n .throw()" },
 
{ input: '{xxx;}()', output: '{\n xxx;\n}()' },
 
{ unchanged: "a = \\'a\\'\nb = \\'b\\'" },
{ unchanged: "a = /reg/exp" },
{ unchanged: "a = /reg/" },
{ unchanged: '/abc/.test()' },
{ unchanged: '/abc/i.test()' },
{ input: "{/abc/i.test()}", output: "{\n /abc/i.test()\n}" },
{ input: 'var x=(a)/a;', output: 'var x = (a) / a;' },
 
{ unchanged: 'x != -1' },
 
{ input: 'for (; s-->0;)t', output: 'for (; s-- > 0;) t' },
{ input: 'for (; s++>0;)u', output: 'for (; s++ > 0;) u' },
{ input: 'a = s++>s--;', output: 'a = s++ > s--;' },
{ input: 'a = s++>--s;', output: 'a = s++ > --s;' },
 
{ input: '{x=#1=[]}', output: '{\n x = #1=[]\n}' },
{ input: '{a:#1={}}', output: '{\n a: #1={}\n}' },
{ input: '{a:#1#}', output: '{\n a: #1#\n}' },
 
{ fragment: true, unchanged: '"incomplete-string' },
{ fragment: true, unchanged: "\\'incomplete-string" },
{ fragment: true, unchanged: '/incomplete-regex' },
{ fragment: true, unchanged: '`incomplete-template-string' },
 
{ fragment: true, input: '{a:1},{a:2}', output: '{\n a: 1\n}, {\n a: 2\n}' },
{ fragment: true, input: 'var ary=[{a:1}, {a:2}];', output: 'var ary = [{\n a: 1\n}, {\n a: 2\n}];' },
 
{ comment: 'incomplete', fragment: true, input: '{a:#1', output: '{\n a: #1' },
{ comment: 'incomplete', fragment: true, input: '{a:#', output: '{\n a: #' },
 
{ comment: 'incomplete', fragment: true, input: '}}}', output: '}\n}\n}' },
 
{ fragment: true, unchanged: '<!--\nvoid();\n// -->' },
 
{ comment: 'incomplete regexp', fragment: true, input: 'a=/regexp', output: 'a = /regexp' },
 
{ input: '{a:#1=[],b:#1#,c:#999999#}', output: '{\n a: #1=[],\n b: #1#,\n c: #999999#\n}' },
 
{ input: "do{x()}while(a>1)", output: "do {\n x()\n} while (a > 1)" },
 
{ input: "x(); /reg/exp.match(something)", output: "x();\n/reg/exp.match(something)" },
 
{ fragment: true, input: "something();(", output: "something();\n(" },
{ fragment: true, input: "#!she/bangs, she bangs\nf=1", output: "#!she/bangs, she bangs\n\nf = 1" },
{ fragment: true, input: "#!she/bangs, she bangs\n\nf=1", output: "#!she/bangs, she bangs\n\nf = 1" },
{ fragment: true, unchanged: "#!she/bangs, she bangs\n\n/* comment */" },
{ fragment: true, unchanged: "#!she/bangs, she bangs\n\n\n/* comment */" },
{ fragment: true, unchanged: "#" },
{ fragment: true, unchanged: "#!" },
 
{ unchanged: "function namespace::something()" },
 
{ fragment: true, unchanged: "<!--\nsomething();\n-->" },
{ fragment: true, input: "<!--\nif(i<0){bla();}\n-->", output: "<!--\nif (i < 0) {\n bla();\n}\n-->" },
 
{ input: '{foo();--bar;}', output: '{\n foo();\n --bar;\n}' },
{ input: '{foo();++bar;}', output: '{\n foo();\n ++bar;\n}' },
{ input: '{--bar;}', output: '{\n --bar;\n}' },
{ input: '{++bar;}', output: '{\n ++bar;\n}' },
{ input: 'if(true)++a;', output: 'if (true) ++a;' },
{ input: 'if(true)\n++a;', output: 'if (true)\n ++a;' },
{ input: 'if(true)--a;', output: 'if (true) --a;' },
{ input: 'if(true)\n--a;', output: 'if (true)\n --a;' },
{ unchanged: 'elem[array]++;' },
{ unchanged: 'elem++ * elem[array]++;' },
{ unchanged: 'elem-- * -elem[array]++;' },
{ unchanged: 'elem-- + elem[array]++;' },
{ unchanged: 'elem-- - elem[array]++;' },
{ unchanged: 'elem-- - -elem[array]++;' },
{ unchanged: 'elem-- - +elem[array]++;' },
 
 
{
comment: 'Handling of newlines around unary ++ and -- operators',
input: '{foo\n++bar;}',
output: '{\n foo\n ++bar;\n}'
},
{ input: '{foo++\nbar;}', output: '{\n foo++\n bar;\n}' },
 
{
comment: 'This is invalid, but harder to guard against. Issue #203.',
input: '{foo\n++\nbar;}',
output: '{\n foo\n ++\n bar;\n}'
},
 
{
comment: 'regexps',
input: 'a(/abc\\\\/\\\\/def/);b()',
output: "a(/abc\\\\/\\\\/def/);\nb()"
},
{ input: 'a(/a[b\\\\[\\\\]c]d/);b()', output: "a(/a[b\\\\[\\\\]c]d/);\nb()" },
{ comment: 'incomplete char class', fragment: true, unchanged: 'a(/a[b\\\\[' },
 
{
comment: 'allow unescaped / in char classes',
input: 'a(/[a/b]/);b()',
output: "a(/[a/b]/);\nb()"
},
{ unchanged: 'typeof /foo\\\\//;' },
{ unchanged: 'throw /foo\\\\//;' },
{ unchanged: 'do /foo\\\\//;' },
{ unchanged: 'return /foo\\\\//;' },
{ unchanged: 'switch (a) {\n case /foo\\\\//:\n b\n}' },
{ unchanged: 'if (a) /foo\\\\//\nelse /foo\\\\//;' },
 
{ unchanged: 'if (foo) /regex/.test();' },
{ unchanged: "for (index in [1, 2, 3]) /^test$/i.test(s)" },
 
{ unchanged: 'function foo() {\n return [\n "one",\n "two"\n ];\n}' },
{ input: 'a=[[1,2],[4,5],[7,8]]', output: "a = [\n [1, 2],\n [4, 5],\n [7, 8]\n]" },
{
input: 'a=[[1,2],[4,5],function(){},[7,8]]',
output: "a = [\n [1, 2],\n [4, 5],\n function() {},\n [7, 8]\n]"
},
{
input: 'a=[[1,2],[4,5],function(){},function(){},[7,8]]',
output: "a = [\n [1, 2],\n [4, 5],\n function() {},\n function() {},\n [7, 8]\n]"
},
{
input: 'a=[[1,2],[4,5],function(){},[7,8]]',
output: "a = [\n [1, 2],\n [4, 5],\n function() {},\n [7, 8]\n]"
},
{
input: 'a=[b,c,function(){},function(){},d]',
output: "a = [b, c, function() {}, function() {}, d]"
},
{
input: 'a=[b,c,\nfunction(){},function(){},d]',
output: "a = [b, c,\n function() {},\n function() {},\n d\n]"
},
{ input: 'a=[a[1],b[4],c[d[7]]]', output: "a = [a[1], b[4], c[d[7]]]" },
{ input: '[1,2,[3,4,[5,6],7],8]', output: "[1, 2, [3, 4, [5, 6], 7], 8]" },
 
{
input: '[[["1","2"],["3","4"]],[["5","6","7"],["8","9","0"]],[["1","2","3"],["4","5","6","7"],["8","9","0"]]]',
output: '[\n [\n ["1", "2"],\n ["3", "4"]\n ],\n [\n ["5", "6", "7"],\n ["8", "9", "0"]\n ],\n [\n ["1", "2", "3"],\n ["4", "5", "6", "7"],\n ["8", "9", "0"]\n ]\n]'
},
 
{ input: '{[x()[0]];indent;}', output: '{\n [x()[0]];\n indent;\n}' },
{ unchanged: '/*\n foo trailing space \n * bar trailing space \n**/' },
{ unchanged: '{\n /*\n foo \n * bar \n */\n}' },
 
{ unchanged: 'return ++i' },
{ unchanged: 'return !!x' },
{ unchanged: 'return !x' },
{ input: 'return [1,2]', output: 'return [1, 2]' },
{ unchanged: 'return;' },
{ unchanged: 'return\nfunc' },
{ input: 'catch(e)', output: 'catch (e)' },
 
{
input: 'var a=1,b={foo:2,bar:3},{baz:4,wham:5},c=4;',
output: 'var a = 1,\n b = {\n foo: 2,\n bar: 3\n },\n {\n baz: 4,\n wham: 5\n }, c = 4;'
},
{
input: 'var a=1,b={foo:2,bar:3},{baz:4,wham:5},\nc=4;',
output: 'var a = 1,\n b = {\n foo: 2,\n bar: 3\n },\n {\n baz: 4,\n wham: 5\n },\n c = 4;'
},
 
{
comment: 'inline comment',
input_: 'function x(/*int*/ start, /*string*/ foo)',
output: 'function x( /*int*/ start, /*string*/ foo)'
},
 
{
comment: 'javadoc comment',
input: '/**\n* foo\n*/',
output: '/**\n * foo\n */'
},
{ input: '{\n/**\n* foo\n*/\n}', output: '{\n /**\n * foo\n */\n}' },
 
{
comment: 'starless block comment',
unchanged: '/**\nfoo\n*/'
},
{ unchanged: '/**\nfoo\n**/' },
{ unchanged: '/**\nfoo\nbar\n**/' },
{ unchanged: '/**\nfoo\n\nbar\n**/' },
{ unchanged: '/**\nfoo\n bar\n**/' },
{ input: '{\n/**\nfoo\n*/\n}', output: '{\n /**\n foo\n */\n}' },
{ input: '{\n/**\nfoo\n**/\n}', output: '{\n /**\n foo\n **/\n}' },
{ input: '{\n/**\nfoo\nbar\n**/\n}', output: '{\n /**\n foo\n bar\n **/\n}' },
{ input: '{\n/**\nfoo\n\nbar\n**/\n}', output: '{\n /**\n foo\n\n bar\n **/\n}' },
{ input: '{\n/**\nfoo\n bar\n**/\n}', output: '{\n /**\n foo\n bar\n **/\n}' },
{ unchanged: '{\n /**\n foo\nbar\n **/\n}' },
 
{ input: 'var a,b,c=1,d,e,f=2;', output: 'var a, b, c = 1,\n d, e, f = 2;' },
{ input: 'var a,b,c=[],d,e,f=2;', output: 'var a, b, c = [],\n d, e, f = 2;' },
{ unchanged: 'function() {\n var a, b, c, d, e = [],\n f;\n}' },
 
{ input: 'do/regexp/;\nwhile(1);', output: 'do /regexp/;\nwhile (1);' },
{ input: 'var a = a,\na;\nb = {\nb\n}', output: 'var a = a,\n a;\nb = {\n b\n}' },
 
{ unchanged: 'var a = a,\n /* c */\n b;' },
{ unchanged: 'var a = a,\n // c\n b;' },
 
{
comment: 'weird element referencing',
unchanged: 'foo.("bar");'
},
 
 
{ unchanged: 'if (a) a()\nelse b()\nnewline()' },
{ unchanged: 'if (a) a()\nnewline()' },
{ input: 'a=typeof(x)', output: 'a = typeof(x)' },
 
{ unchanged: 'var a = function() {\n return null;\n },\n b = false;' },
 
{ unchanged: 'var a = function() {\n func1()\n}' },
{ unchanged: 'var a = function() {\n func1()\n}\nvar b = function() {\n func2()\n}' },
 
{
comment: 'code with and without semicolons',
input_: 'var whatever = require("whatever");\nfunction() {\n a = 6;\n}',
output: 'var whatever = require("whatever");\n\nfunction() {\n a = 6;\n}'
},
{
input: 'var whatever = require("whatever")\nfunction() {\n a = 6\n}',
output: 'var whatever = require("whatever")\n\nfunction() {\n a = 6\n}'
},
 
{ input: '{"x":[{"a":1,"b":3},\n7,8,8,8,8,{"b":99},{"a":11}]}', output: '{\n "x": [{\n "a": 1,\n "b": 3\n },\n 7, 8, 8, 8, 8, {\n "b": 99\n }, {\n "a": 11\n }\n ]\n}' },
{ input: '{"x":[{"a":1,"b":3},7,8,8,8,8,{"b":99},{"a":11}]}', output: '{\n "x": [{\n "a": 1,\n "b": 3\n }, 7, 8, 8, 8, 8, {\n "b": 99\n }, {\n "a": 11\n }]\n}' },
 
{ input: '{"1":{"1a":"1b"},"2"}', output: '{\n "1": {\n "1a": "1b"\n },\n "2"\n}' },
{ input: '{a:{a:b},c}', output: '{\n a: {\n a: b\n },\n c\n}' },
 
{ input: '{[y[a]];keep_indent;}', output: '{\n [y[a]];\n keep_indent;\n}' },
 
{ input: 'if (x) {y} else { if (x) {y}}', output: 'if (x) {\n y\n} else {\n if (x) {\n y\n }\n}' },
 
{ unchanged: 'if (foo) one()\ntwo()\nthree()' },
{ unchanged: 'if (1 + foo() && bar(baz()) / 2) one()\ntwo()\nthree()' },
{ unchanged: 'if (1 + foo() && bar(baz()) / 2) one();\ntwo();\nthree();' },
 
{ input: 'var a=1,b={bang:2},c=3;', output: 'var a = 1,\n b = {\n bang: 2\n },\n c = 3;' },
{ input: 'var a={bing:1},b=2,c=3;', output: 'var a = {\n bing: 1\n },\n b = 2,\n c = 3;' },
 
],
}],
examples: [{
// Example
group_name: "one",
description: "",
options: [],
values: [{
source: "", //string or array of lines
output: "" //string or array of lines
}]
}]
};
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/generate-tests.js
@@ -0,0 +1,216 @@
#!/usr/bin/env node
 
/*
The MIT License (MIT)
 
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
 
var fs = require('fs');
var mustache = require('mustache');
var path = require('path');
 
function generate_tests() {
// javascript
generate_test_files('javascript', 'bt', 'js/test/generated/beautify-javascript-tests.js', 'python/jsbeautifier/tests/generated/tests.py');
 
// css
generate_test_files('css', 't', 'js/test/generated/beautify-css-tests.js', 'python/cssbeautifier/tests/generated/tests.py');
 
// html
// no python html beautifier, so no tests
generate_test_files('html', 'bth', 'js/test/generated/beautify-html-tests.js');
}
 
function generate_test_files(data_folder, test_method, node_output, python_output) {
var data_file_path, input_path, template_file_path;
var test_data, template;
 
input_path = path.resolve(__dirname, 'data', data_folder);
data_file_path = path.resolve(input_path, 'tests.js');
test_data = require(data_file_path).test_data;
 
template_file_path = path.resolve(input_path, 'node.mustache');
template = fs.readFileSync(template_file_path, { encoding: 'utf-8' });
set_formatters(test_data, test_method, '// ');
set_generated_header(test_data, data_file_path, template_file_path);
fs.writeFileSync(path.resolve(__dirname, '..', node_output),
mustache.render(template, test_data), { encoding: 'utf-8' });
 
if (python_output) {
template_file_path = path.resolve(input_path, 'python.mustache');
template = fs.readFileSync(template_file_path, { encoding: 'utf-8' });
set_formatters(test_data, test_method, '# ');
set_generated_header(test_data, data_file_path, template_file_path);
fs.writeFileSync(path.resolve(__dirname, '..', python_output),
mustache.render(template, test_data), { encoding: 'utf-8' });
}
}
 
function set_generated_header(data, data_file_path, template_file_path) {
var relative_script_path = path.relative(process.cwd(), __filename).split(path.sep).join('/');
var relative_data_file_path = path.relative(process.cwd(), data_file_path).split(path.sep).join('/');
var relative_template_file_path = path.relative(process.cwd(), template_file_path).split(path.sep).join('/');
 
data.header_text =
' AUTO-GENERATED. DO NOT MODIFY.\n' +
' Script: ' + relative_script_path + '\n' +
' Template: ' + relative_template_file_path + '\n' +
' Data: ' + relative_data_file_path;
 
}
 
function isStringOrArray(val) {
return typeof val === 'string' || val instanceof Array;
}
 
function getTestString(val) {
val = val.split('\n');
 
var result = "'" + val.join("\\n' +\n '").replace(/\t/g, '\\t') + "'";
result = result.replace(/' \+\n ''$/, "'");
return result;
}
 
function set_formatters(data, test_method, comment_mark) {
 
// utility mustache functions
data.matrix_context_string = function() {
var context = this;
return function(text, render) {
var outputs = [];
// text is ignored for this
for (var name in context) {
if (name === 'options') {
continue;
}
 
if (context.hasOwnProperty(name)) {
outputs.push(name + ' = "' + context[name].replace(/\n/g, '\\n').replace(/\t/g, '\\t') + '"');
}
}
return render(outputs.join(', '));
};
};
 
data.test_line = function() {
return function(text, render) {
var method_text = this.fragment ? 'test_fragment' : test_method;
var comment = '';
var before_input = method_text + '(';
var input = null;
var before_output = ', ';
var output = null;
 
// text is ignored for this.
if (typeof this.comment === 'string') {
this.comment = this.comment.split('\n');
}
 
if (this.comment instanceof Array) {
comment = '\n ' + comment_mark + this.comment.join('\n ' + comment_mark) + '\n ';
}
 
// input: the default field
// input_: allow underscore for formatting alignment with "output"
// unchanged: use "unchanged" instead of "input" if there is no output
input = this.input || this.input_ || this.unchanged;
if (input instanceof Array) {
input = input.join('\n');
}
 
if (isStringOrArray(this.output)) {
output = this.output;
if (output instanceof Array) {
output = output.join('\n');
}
}
 
// Do all most error checking
if (!(this.input !== null || this.input_ !== null || this.unchanged !== null)) {
throw "Missing test input field (input, input_, or unchanged).";
} else if ((this.input !== null && (this.input_ !== null || this.unchanged !== null)) &&
(this.input_ === null || this.unchanged === null)) {
throw "Only one test input field allowed (input, input_, or unchanged): " + input;
} else if (output && isStringOrArray(this.unchanged)) {
throw "Cannot specify 'output' with 'unchanged' test input: " + input;
} else if (!output && !isStringOrArray(this.unchanged)) {
throw "Neither 'output' nor 'unchanged' specified for test input: " + input;
} else if (input === output) {
// Raw input and output can be the same, just omit output.
throw "Test strings are identical. Omit 'output' and use 'unchanged': " + input;
}
 
if (output && output.indexOf('<%') !== -1) {
mustache.tags = ['<%', '%>'];
}
 
input = getTestString(render(input));
 
if (output) {
output = getTestString(render(output));
} else {
output = '';
}
 
if (output && output.indexOf('<%') !== -1) {
mustache.tags = ['{{', '}}'];
}
 
if (this.input_ || input.indexOf('\n') !== -1 || output.indexOf('\n') !== -1) {
before_input = method_text + '(\n ';
before_output = ',\n ' + comment_mark + ' -- output --\n ';
}
if (output === '') {
before_output = '';
}
 
// Rendered input and output can be the same, just omit output.
if (output === input) {
before_output = '';
output = '';
}
return comment + before_input + input + before_output + output + ')';
};
};
 
data.set_mustache_tags = function() {
return function( /* text, render */ ) {
if (this.template) {
mustache.tags = this.template.split(' ');
}
return '';
};
};
 
data.unset_mustache_tags = function() {
return function( /* text , render */ ) {
if (this.template) {
mustache.tags = ['{{', '}}'];
}
return '';
};
};
}
 
generate_tests();
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/resources/html-with-base64image.html
@@ -0,0 +1 @@
<p><img src="data:image/png;base64,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"/><br/></p>
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/resources/underscore-min.js
@@ -0,0 +1,6 @@
// Underscore.js 1.7.0
// http://underscorejs.org
// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Underscore may be freely distributed under the MIT license.
(function(){var n=this,t=n._,r=Array.prototype,e=Object.prototype,u=Function.prototype,i=r.push,a=r.slice,o=r.concat,l=e.toString,c=e.hasOwnProperty,f=Array.isArray,s=Object.keys,p=u.bind,h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=h),exports._=h):n._=h,h.VERSION="1.7.0";var g=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}};h.iteratee=function(n,t,r){return null==n?h.identity:h.isFunction(n)?g(n,t,r):h.isObject(n)?h.matches(n):h.property(n)},h.each=h.forEach=function(n,t,r){if(null==n)return n;t=g(t,r);var e,u=n.length;if(u===+u)for(e=0;u>e;e++)t(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,t,r){if(null==n)return[];t=h.iteratee(t,r);for(var e,u=n.length!==+n.length&&h.keys(n),i=(u||n).length,a=Array(i),o=0;i>o;o++)e=u?u[o]:o,a[o]=t(n[e],e,n);return a};var v="Reduce of empty array with no initial value";h.reduce=h.foldl=h.inject=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length,o=0;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[o++]:o++]}for(;a>o;o++)u=i?i[o]:o,r=t(r,n[u],u,n);return r},h.reduceRight=h.foldr=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[--a]:--a]}for(;a--;)u=i?i[a]:a,r=t(r,n[u],u,n);return r},h.find=h.detect=function(n,t,r){var e;return t=h.iteratee(t,r),h.some(n,function(n,r,u){return t(n,r,u)?(e=n,!0):void 0}),e},h.filter=h.select=function(n,t,r){var e=[];return null==n?e:(t=h.iteratee(t,r),h.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e)},h.reject=function(n,t,r){return h.filter(n,h.negate(h.iteratee(t)),r)},h.every=h.all=function(n,t,r){if(null==n)return!0;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,!t(n[u],u,n))return!1;return!0},h.some=h.any=function(n,t,r){if(null==n)return!1;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,t(n[u],u,n))return!0;return!1},h.contains=h.include=function(n,t){return null==n?!1:(n.length!==+n.length&&(n=h.values(n)),h.indexOf(n,t)>=0)},h.invoke=function(n,t){var r=a.call(arguments,2),e=h.isFunction(t);return h.map(n,function(n){return(e?t:n[t]).apply(n,r)})},h.pluck=function(n,t){return h.map(n,h.property(t))},h.where=function(n,t){return h.filter(n,h.matches(t))},h.findWhere=function(n,t){return h.find(n,h.matches(t))},h.max=function(n,t,r){var e,u,i=-1/0,a=-1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],e>i&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(u>a||u===-1/0&&i===-1/0)&&(i=n,a=u)});return i},h.min=function(n,t,r){var e,u,i=1/0,a=1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],i>e&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(a>u||1/0===u&&1/0===i)&&(i=n,a=u)});return i},h.shuffle=function(n){for(var t,r=n&&n.length===+n.length?n:h.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=h.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},h.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=h.values(n)),n[h.random(n.length-1)]):h.shuffle(n).slice(0,Math.max(0,t))},h.sortBy=function(n,t,r){return t=h.iteratee(t,r),h.pluck(h.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var m=function(n){return function(t,r,e){var u={};return r=h.iteratee(r,e),h.each(t,function(e,i){var a=r(e,i,t);n(u,e,a)}),u}};h.groupBy=m(function(n,t,r){h.has(n,r)?n[r].push(t):n[r]=[t]}),h.indexBy=m(function(n,t,r){n[r]=t}),h.countBy=m(function(n,t,r){h.has(n,r)?n[r]++:n[r]=1}),h.sortedIndex=function(n,t,r,e){r=h.iteratee(r,e,1);for(var u=r(t),i=0,a=n.length;a>i;){var o=i+a>>>1;r(n[o])<u?i=o+1:a=o}return i},h.toArray=function(n){return n?h.isArray(n)?a.call(n):n.length===+n.length?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:n.length===+n.length?n.length:h.keys(n).length},h.partition=function(n,t,r){t=h.iteratee(t,r);var e=[],u=[];return h.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},h.first=h.head=h.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:a.call(n,0,t)},h.initial=function(n,t,r){return a.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},h.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:a.call(n,Math.max(n.length-t,0))},h.rest=h.tail=h.drop=function(n,t,r){return a.call(n,null==t||r?1:t)},h.compact=function(n){return h.filter(n,h.identity)};var y=function(n,t,r,e){if(t&&h.every(n,h.isArray))return o.apply(e,n);for(var u=0,a=n.length;a>u;u++){var l=n[u];h.isArray(l)||h.isArguments(l)?t?i.apply(e,l):y(l,t,r,e):r||e.push(l)}return e};h.flatten=function(n,t){return y(n,t,!1,[])},h.without=function(n){return h.difference(n,a.call(arguments,1))},h.uniq=h.unique=function(n,t,r,e){if(null==n)return[];h.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=h.iteratee(r,e));for(var u=[],i=[],a=0,o=n.length;o>a;a++){var l=n[a];if(t)a&&i===l||u.push(l),i=l;else if(r){var c=r(l,a,n);h.indexOf(i,c)<0&&(i.push(c),u.push(l))}else h.indexOf(u,l)<0&&u.push(l)}return u},h.union=function(){return h.uniq(y(arguments,!0,!0,[]))},h.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!h.contains(t,i)){for(var a=1;r>a&&h.contains(arguments[a],i);a++);a===r&&t.push(i)}}return t},h.difference=function(n){var t=y(a.call(arguments,1),!0,!0,[]);return h.filter(n,function(n){return!h.contains(t,n)})},h.zip=function(n){if(null==n)return[];for(var t=h.max(arguments,"length").length,r=Array(t),e=0;t>e;e++)r[e]=h.pluck(arguments,e);return r},h.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},h.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=h.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}for(;u>e;e++)if(n[e]===t)return e;return-1},h.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=n.length;for("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},h.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var d=function(){};h.bind=function(n,t){var r,e;if(p&&n.bind===p)return p.apply(n,a.call(arguments,1));if(!h.isFunction(n))throw new TypeError("Bind must be called on a function");return r=a.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(a.call(arguments)));d.prototype=n.prototype;var u=new d;d.prototype=null;var i=n.apply(u,r.concat(a.call(arguments)));return h.isObject(i)?i:u}},h.partial=function(n){var t=a.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===h&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},h.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=h.bind(n[r],n);return n},h.memoize=function(n,t){var r=function(e){var u=r.cache,i=t?t.apply(this,arguments):e;return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},h.delay=function(n,t){var r=a.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},h.defer=function(n){return h.delay.apply(h,[n,1].concat(a.call(arguments,1)))},h.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var l=function(){o=r.leading===!1?0:h.now(),a=null,i=n.apply(e,u),a||(e=u=null)};return function(){var c=h.now();o||r.leading!==!1||(o=c);var f=t-(c-o);return e=this,u=arguments,0>=f||f>t?(clearTimeout(a),a=null,o=c,i=n.apply(e,u),a||(e=u=null)):a||r.trailing===!1||(a=setTimeout(l,f)),i}},h.debounce=function(n,t,r){var e,u,i,a,o,l=function(){var c=h.now()-a;t>c&&c>0?e=setTimeout(l,t-c):(e=null,r||(o=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,a=h.now();var c=r&&!e;return e||(e=setTimeout(l,t)),c&&(o=n.apply(i,u),i=u=null),o}},h.wrap=function(n,t){return h.partial(t,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},h.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},h.before=function(n,t){var r;return function(){return--n>0?r=t.apply(this,arguments):t=null,r}},h.once=h.partial(h.before,2),h.keys=function(n){if(!h.isObject(n))return[];if(s)return s(n);var t=[];for(var r in n)h.has(n,r)&&t.push(r);return t},h.values=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},h.pairs=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},h.invert=function(n){for(var t={},r=h.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},h.functions=h.methods=function(n){var t=[];for(var r in n)h.isFunction(n[r])&&t.push(r);return t.sort()},h.extend=function(n){if(!h.isObject(n))return n;for(var t,r,e=1,u=arguments.length;u>e;e++){t=arguments[e];for(r in t)c.call(t,r)&&(n[r]=t[r])}return n},h.pick=function(n,t,r){var e,u={};if(null==n)return u;if(h.isFunction(t)){t=g(t,r);for(e in n){var i=n[e];t(i,e,n)&&(u[e]=i)}}else{var l=o.apply([],a.call(arguments,1));n=new Object(n);for(var c=0,f=l.length;f>c;c++)e=l[c],e in n&&(u[e]=n[e])}return u},h.omit=function(n,t,r){if(h.isFunction(t))t=h.negate(t);else{var e=h.map(o.apply([],a.call(arguments,1)),String);t=function(n,t){return!h.contains(e,t)}}return h.pick(n,t,r)},h.defaults=function(n){if(!h.isObject(n))return n;for(var t=1,r=arguments.length;r>t;t++){var e=arguments[t];for(var u in e)n[u]===void 0&&(n[u]=e[u])}return n},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,t){return t(n),n};var b=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof h&&(n=n._wrapped),t instanceof h&&(t=t._wrapped);var u=l.call(n);if(u!==l.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]===n)return e[i]===t;var a=n.constructor,o=t.constructor;if(a!==o&&"constructor"in n&&"constructor"in t&&!(h.isFunction(a)&&a instanceof a&&h.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c,f;if("[object Array]"===u){if(c=n.length,f=c===t.length)for(;c--&&(f=b(n[c],t[c],r,e)););}else{var s,p=h.keys(n);if(c=p.length,f=h.keys(t).length===c)for(;c--&&(s=p[c],f=h.has(t,s)&&b(n[s],t[s],r,e)););}return r.pop(),e.pop(),f};h.isEqual=function(n,t){return b(n,t,[],[])},h.isEmpty=function(n){if(null==n)return!0;if(h.isArray(n)||h.isString(n)||h.isArguments(n))return 0===n.length;for(var t in n)if(h.has(n,t))return!1;return!0},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=f||function(n){return"[object Array]"===l.call(n)},h.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp"],function(n){h["is"+n]=function(t){return l.call(t)==="[object "+n+"]"}}),h.isArguments(arguments)||(h.isArguments=function(n){return h.has(n,"callee")}),"function"!=typeof/./&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&n!==+n},h.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===l.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,t){return null!=n&&c.call(n,t)},h.noConflict=function(){return n._=t,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return function(t){return t[n]}},h.matches=function(n){var t=h.pairs(n),r=t.length;return function(n){if(null==n)return!r;n=new Object(n);for(var e=0;r>e;e++){var u=t[e],i=u[0];if(u[1]!==n[i]||!(i in n))return!1}return!0}},h.times=function(n,t,r){var e=Array(Math.max(0,n));t=g(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},h.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var _={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},w=h.invert(_),j=function(n){var t=function(t){return n[t]},r="(?:"+h.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=j(_),h.unescape=j(w),h.result=function(n,t){if(null==n)return void 0;var r=n[t];return h.isFunction(r)?n[t]():r};var x=0;h.uniqueId=function(n){var t=++x+"";return n?n+t:t},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var A=/(.)^/,k={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},O=/\\|'|\r|\n|\u2028|\u2029/g,F=function(n){return"\\"+k[n]};h.template=function(n,t,r){!t&&r&&(t=r),t=h.defaults({},t,h.templateSettings);var e=RegExp([(t.escape||A).source,(t.interpolate||A).source,(t.evaluate||A).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(O,F),u=o+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":a&&(i+="';\n"+a+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=new Function(t.variable||"obj","_",i)}catch(o){throw o.source=i,o}var l=function(n){return a.call(this,n,h)},c=t.variable||"obj";return l.source="function("+c+"){\n"+i+"}",l},h.chain=function(n){var t=h(n);return t._chain=!0,t};var E=function(n){return this._chain?h(n).chain():n};h.mixin=function(n){h.each(h.functions(n),function(t){var r=h[t]=n[t];h.prototype[t]=function(){var n=[this._wrapped];return i.apply(n,arguments),E.call(this,r.apply(h,n))}})},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=r[n];h.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],E.call(this,r)}}),h.each(["concat","join","slice"],function(n){var t=r[n];h.prototype[n]=function(){return E.call(this,t.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}).call(this);
//# sourceMappingURL=underscore-min.map
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/js-beautify/test/resources/underscore.js
@@ -0,0 +1,1439 @@
// Underscore.js 1.7.0
// http://underscorejs.org
// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Underscore may be freely distributed under the MIT license.
 
(function() {
 
// Baseline setup
// --------------
 
// Establish the root object, `window` in the browser, or `exports` on the server.
var root = this;
 
// Save the previous value of the `_` variable.
var previousUnderscore = root._;
 
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
 
// Create quick reference variables for speed access to core prototypes.
var
push = ArrayProto.push,
slice = ArrayProto.slice,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
 
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
var
nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = FuncProto.bind;
 
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj;
};
 
// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
// the browser, add `_` as a global object.
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} else {
root._ = _;
}
 
// Current version.
_.VERSION = '1.7.0';
 
// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
var optimizeCb = function(func, context, argCount) {
if (context === void 0) return func;
switch (argCount == null ? 3 : argCount) {
case 1: return function(value) {
return func.call(context, value);
};
case 2: return function(value, other) {
return func.call(context, value, other);
};
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
};
 
// A mostly-internal function to generate callbacks that can be applied
// to each element in a collection, returning the desired result — either
// identity, an arbitrary callback, a property matcher, or a property accessor.
var cb = function(value, context, argCount) {
if (value == null) return _.identity;
if (_.isFunction(value)) return optimizeCb(value, context, argCount);
if (_.isObject(value)) return _.matches(value);
return _.property(value);
};
_.iteratee = function(value, context) {
return cb(value, context);
};
 
// Collection Functions
// --------------------
 
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles raw objects in addition to array-likes. Treats all
// sparse array-likes as if they were dense.
_.each = _.forEach = function(obj, iteratee, context) {
if (obj == null) return obj;
iteratee = optimizeCb(iteratee, context);
var i, length = obj.length;
if (length === +length) {
for (i = 0; i < length; i++) {
iteratee(obj[i], i, obj);
}
} else {
var keys = _.keys(obj);
for (i = 0, length = keys.length; i < length; i++) {
iteratee(obj[keys[i]], keys[i], obj);
}
}
return obj;
};
 
// Return the results of applying the iteratee to each element.
_.map = _.collect = function(obj, iteratee, context) {
if (obj == null) return [];
iteratee = cb(iteratee, context);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
results = Array(length),
currentKey;
for (var index = 0; index < length; index++) {
currentKey = keys ? keys[index] : index;
results[index] = iteratee(obj[currentKey], currentKey, obj);
}
return results;
};
 
var reduceError = 'Reduce of empty array with no initial value';
 
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`.
_.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
if (obj == null) obj = [];
iteratee = optimizeCb(iteratee, context, 4);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
index = 0, currentKey;
if (arguments.length < 3) {
if (!length) throw new TypeError(reduceError);
memo = obj[keys ? keys[index++] : index++];
}
for (; index < length; index++) {
currentKey = keys ? keys[index] : index;
memo = iteratee(memo, obj[currentKey], currentKey, obj);
}
return memo;
};
 
// The right-associative version of reduce, also known as `foldr`.
_.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
if (obj == null) obj = [];
iteratee = optimizeCb(iteratee, context, 4);
var keys = obj.length !== + obj.length && _.keys(obj),
index = (keys || obj).length,
currentKey;
if (arguments.length < 3) {
if (!index) throw new TypeError(reduceError);
memo = obj[keys ? keys[--index] : --index];
}
while (index--) {
currentKey = keys ? keys[index] : index;
memo = iteratee(memo, obj[currentKey], currentKey, obj);
}
return memo;
};
 
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, predicate, context) {
var result;
predicate = cb(predicate, context);
_.some(obj, function(value, index, list) {
if (predicate(value, index, list)) {
result = value;
return true;
}
});
return result;
};
 
// Return all the elements that pass a truth test.
// Aliased as `select`.
_.filter = _.select = function(obj, predicate, context) {
var results = [];
if (obj == null) return results;
predicate = cb(predicate, context);
_.each(obj, function(value, index, list) {
if (predicate(value, index, list)) results.push(value);
});
return results;
};
 
// Return all the elements for which a truth test fails.
_.reject = function(obj, predicate, context) {
return _.filter(obj, _.negate(cb(predicate)), context);
};
 
// Determine whether all of the elements match a truth test.
// Aliased as `all`.
_.every = _.all = function(obj, predicate, context) {
if (obj == null) return true;
predicate = cb(predicate, context);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
index, currentKey;
for (index = 0; index < length; index++) {
currentKey = keys ? keys[index] : index;
if (!predicate(obj[currentKey], currentKey, obj)) return false;
}
return true;
};
 
// Determine if at least one element in the object matches a truth test.
// Aliased as `any`.
_.some = _.any = function(obj, predicate, context) {
if (obj == null) return false;
predicate = cb(predicate, context);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
index, currentKey;
for (index = 0; index < length; index++) {
currentKey = keys ? keys[index] : index;
if (predicate(obj[currentKey], currentKey, obj)) return true;
}
return false;
};
 
// Determine if the array or object contains a given value (using `===`).
// Aliased as `include`.
_.contains = _.include = function(obj, target) {
if (obj == null) return false;
if (obj.length !== +obj.length) obj = _.values(obj);
return _.indexOf(obj, target) >= 0;
};
 
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
return (isFunc ? method : value[method]).apply(value, args);
});
};
 
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
return _.map(obj, _.property(key));
};
 
// Convenience version of a common use case of `filter`: selecting only objects
// containing specific `key:value` pairs.
_.where = function(obj, attrs) {
return _.filter(obj, _.matches(attrs));
};
 
// Convenience version of a common use case of `find`: getting the first object
// containing specific `key:value` pairs.
_.findWhere = function(obj, attrs) {
return _.find(obj, _.matches(attrs));
};
 
// Return the maximum element (or element-based computation).
_.max = function(obj, iteratee, context) {
var result = -Infinity, lastComputed = -Infinity,
value, computed;
if (iteratee == null && obj != null) {
obj = obj.length === +obj.length ? obj : _.values(obj);
for (var i = 0, length = obj.length; i < length; i++) {
value = obj[i];
if (value > result) {
result = value;
}
}
} else {
iteratee = cb(iteratee, context);
_.each(obj, function(value, index, list) {
computed = iteratee(value, index, list);
if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
result = value;
lastComputed = computed;
}
});
}
return result;
};
 
// Return the minimum element (or element-based computation).
_.min = function(obj, iteratee, context) {
var result = Infinity, lastComputed = Infinity,
value, computed;
if (iteratee == null && obj != null) {
obj = obj.length === +obj.length ? obj : _.values(obj);
for (var i = 0, length = obj.length; i < length; i++) {
value = obj[i];
if (value < result) {
result = value;
}
}
} else {
iteratee = cb(iteratee, context);
_.each(obj, function(value, index, list) {
computed = iteratee(value, index, list);
if (computed < lastComputed || computed === Infinity && result === Infinity) {
result = value;
lastComputed = computed;
}
});
}
return result;
};
 
// Shuffle a collection, using the modern version of the
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
_.shuffle = function(obj) {
var set = obj && obj.length === +obj.length ? obj : _.values(obj);
var length = set.length;
var shuffled = Array(length);
for (var index = 0, rand; index < length; index++) {
rand = _.random(0, index);
if (rand !== index) shuffled[index] = shuffled[rand];
shuffled[rand] = set[index];
}
return shuffled;
};
 
// Sample **n** random values from a collection.
// If **n** is not specified, returns a single random element.
// The internal `guard` argument allows it to work with `map`.
_.sample = function(obj, n, guard) {
if (n == null || guard) {
if (obj.length !== +obj.length) obj = _.values(obj);
return obj[_.random(obj.length - 1)];
}
return _.shuffle(obj).slice(0, Math.max(0, n));
};
 
// Sort the object's values by a criterion produced by an iteratee.
_.sortBy = function(obj, iteratee, context) {
iteratee = cb(iteratee, context);
return _.pluck(_.map(obj, function(value, index, list) {
return {
value: value,
index: index,
criteria: iteratee(value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria;
var b = right.criteria;
if (a !== b) {
if (a > b || a === void 0) return 1;
if (a < b || b === void 0) return -1;
}
return left.index - right.index;
}), 'value');
};
 
// An internal function used for aggregate "group by" operations.
var group = function(behavior) {
return function(obj, iteratee, context) {
var result = {};
iteratee = cb(iteratee, context);
_.each(obj, function(value, index) {
var key = iteratee(value, index, obj);
behavior(result, value, key);
});
return result;
};
};
 
// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
_.groupBy = group(function(result, value, key) {
if (_.has(result, key)) result[key].push(value); else result[key] = [value];
});
 
// Indexes the object's values by a criterion, similar to `groupBy`, but for
// when you know that your index values will be unique.
_.indexBy = group(function(result, value, key) {
result[key] = value;
});
 
// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
_.countBy = group(function(result, value, key) {
if (_.has(result, key)) result[key]++; else result[key] = 1;
});
 
// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iteratee, context) {
iteratee = cb(iteratee, context, 1);
var value = iteratee(obj);
var low = 0, high = array.length;
while (low < high) {
var mid = low + high >>> 1;
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
}
return low;
};
 
// Safely create a real, live array from anything iterable.
_.toArray = function(obj) {
if (!obj) return [];
if (_.isArray(obj)) return slice.call(obj);
if (obj.length === +obj.length) return _.map(obj, _.identity);
return _.values(obj);
};
 
// Return the number of elements in an object.
_.size = function(obj) {
if (obj == null) return 0;
return obj.length === +obj.length ? obj.length : _.keys(obj).length;
};
 
// Split a collection into two arrays: one whose elements all satisfy the given
// predicate, and one whose elements all do not satisfy the predicate.
_.partition = function(obj, predicate, context) {
predicate = cb(predicate, context);
var pass = [], fail = [];
_.each(obj, function(value, key, obj) {
(predicate(value, key, obj) ? pass : fail).push(value);
});
return [pass, fail];
};
 
// Array Functions
// ---------------
 
// Get the first element of an array. Passing **n** will return the first N
// values in the array. Aliased as `head` and `take`. The **guard** check
// allows it to work with `_.map`.
_.first = _.head = _.take = function(array, n, guard) {
if (array == null) return void 0;
if (n == null || guard) return array[0];
return _.initial(array, array.length - n);
};
 
// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N. The **guard** check allows it to work with
// `_.map`.
_.initial = function(array, n, guard) {
return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
};
 
// Get the last element of an array. Passing **n** will return the last N
// values in the array. The **guard** check allows it to work with `_.map`.
_.last = function(array, n, guard) {
if (array == null) return void 0;
if (n == null || guard) return array[array.length - 1];
return _.rest(array, Math.max(0, array.length - n));
};
 
// Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
// Especially useful on the arguments object. Passing an **n** will return
// the rest N values in the array. The **guard**
// check allows it to work with `_.map`.
_.rest = _.tail = _.drop = function(array, n, guard) {
return slice.call(array, n == null || guard ? 1 : n);
};
 
// Trim out all falsy values from an array.
_.compact = function(array) {
return _.filter(array, _.identity);
};
 
// Internal implementation of a recursive `flatten` function.
var flatten = function(input, shallow, strict, startIndex) {
var output = [], idx = 0, value;
for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
value = input[i];
if (value && value.length >= 0 && (_.isArray(value) || _.isArguments(value))) {
//flatten current level of array or arguments object
if (!shallow) value = flatten(value, shallow, strict);
var j = 0, len = value.length;
output.length += len;
while (j < len) {
output[idx++] = value[j++];
}
} else if (!strict) {
output[idx++] = value;
}
}
return output;
};
 
// Flatten out an array, either recursively (by default), or just one level.
_.flatten = function(array, shallow) {
return flatten(array, shallow, false);
};
 
// Return a version of the array that does not contain the specified value(s).
_.without = function(array) {
return _.difference(array, slice.call(arguments, 1));
};
 
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted, iteratee, context) {
if (array == null) return [];
if (!_.isBoolean(isSorted)) {
context = iteratee;
iteratee = isSorted;
isSorted = false;
}
if (iteratee != null) iteratee = cb(iteratee, context);
var result = [];
var seen = [];
for (var i = 0, length = array.length; i < length; i++) {
var value = array[i],
computed = iteratee ? iteratee(value, i, array) : value;
if (isSorted) {
if (!i || seen !== computed) result.push(value);
seen = computed;
} else if (iteratee) {
if (!_.contains(seen, computed)) {
seen.push(computed);
result.push(value);
}
} else if (!_.contains(result, value)) {
result.push(value);
}
}
return result;
};
 
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
_.union = function() {
return _.uniq(flatten(arguments, true, true));
};
 
// Produce an array that contains every item shared between all the
// passed-in arrays.
_.intersection = function(array) {
if (array == null) return [];
var result = [];
var argsLength = arguments.length;
for (var i = 0, length = array.length; i < length; i++) {
var item = array[i];
if (_.contains(result, item)) continue;
for (var j = 1; j < argsLength; j++) {
if (!_.contains(arguments[j], item)) break;
}
if (j === argsLength) result.push(item);
}
return result;
};
 
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
_.difference = function(array) {
var rest = flatten(arguments, true, true, 1);
return _.filter(array, function(value){
return !_.contains(rest, value);
});
};
 
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function(array) {
if (array == null) return [];
var length = _.max(arguments, 'length').length;
var results = Array(length);
while (length-- > 0) {
results[length] = _.pluck(arguments, length);
}
return results;
};
 
// Complement of _.zip. Unzip accepts an array of arrays and groups
// each array's elements on shared indices
_.unzip = function(array) {
return _.zip.apply(null, array);
};
 
// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values.
_.object = function(list, values) {
if (list == null) return {};
var result = {};
for (var i = 0, length = list.length; i < length; i++) {
if (values) {
result[list[i]] = values[i];
} else {
result[list[i][0]] = list[i][1];
}
}
return result;
};
 
// Return the position of the first occurrence of an item in an array,
// or -1 if the item is not included in the array.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
var i = 0, length = array && array.length;
if (typeof isSorted == 'number') {
i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
} else if (isSorted) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
for (; i < length; i++) if (array[i] === item) return i;
return -1;
};
 
_.lastIndexOf = function(array, item, from) {
var idx = array ? array.length : 0;
if (typeof from == 'number') {
idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
}
while (--idx >= 0) if (array[idx] === item) return idx;
return -1;
};
 
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
step = step || 1;
 
var length = Math.max(Math.ceil((stop - start) / step), 0);
var range = Array(length);
 
for (var idx = 0; idx < length; idx++, start += step) {
range[idx] = start;
}
 
return range;
};
 
// Function (ahem) Functions
// ------------------
 
// Reusable constructor function for prototype setting.
var Ctor = function(){};
 
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
// available.
_.bind = function(func, context) {
var args, bound;
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
args = slice.call(arguments, 2);
bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
Ctor.prototype = func.prototype;
var self = new Ctor;
Ctor.prototype = null;
var result = func.apply(self, args.concat(slice.call(arguments)));
if (_.isObject(result)) return result;
return self;
};
return bound;
};
 
// Partially apply a function by creating a version that has had some of its
// arguments pre-filled, without changing its dynamic `this` context. _ acts
// as a placeholder, allowing any combination of arguments to be pre-filled.
_.partial = function(func) {
var boundArgs = slice.call(arguments, 1);
return function() {
var position = 0;
var args = boundArgs.slice();
for (var i = 0, length = args.length; i < length; i++) {
if (args[i] === _) args[i] = arguments[position++];
}
while (position < arguments.length) args.push(arguments[position++]);
return func.apply(this, args);
};
};
 
// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
_.bindAll = function(obj) {
var i, length = arguments.length, key;
if (length <= 1) throw new Error('bindAll must be passed function names');
for (i = 1; i < length; i++) {
key = arguments[i];
obj[key] = _.bind(obj[key], obj);
}
return obj;
};
 
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
var memoize = function(key) {
var cache = memoize.cache;
var address = '' + (hasher ? hasher.apply(this, arguments) : key);
if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
return cache[address];
};
memoize.cache = {};
return memoize;
};
 
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){
return func.apply(null, args);
}, wait);
};
 
// Defers a function, scheduling it to run after the current call stack has
// cleared.
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
 
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
_.throttle = function(func, wait, options) {
var context, args, result;
var timeout = null;
var previous = 0;
if (!options) options = {};
var later = function() {
previous = options.leading === false ? 0 : _.now();
timeout = null;
result = func.apply(context, args);
if (!timeout) context = args = null;
};
return function() {
var now = _.now();
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
previous = now;
result = func.apply(context, args);
if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
};
 
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
_.debounce = function(func, wait, immediate) {
var timeout, args, context, timestamp, result;
 
var later = function() {
var last = _.now() - timestamp;
 
if (last < wait && last >= 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
if (!timeout) context = args = null;
}
}
};
 
return function() {
context = this;
args = arguments;
timestamp = _.now();
var callNow = immediate && !timeout;
if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
 
return result;
};
};
 
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
return _.partial(wrapper, func);
};
 
// Returns a negated version of the passed-in predicate.
_.negate = function(predicate) {
return function() {
return !predicate.apply(this, arguments);
};
};
 
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
var args = arguments;
var start = args.length - 1;
return function() {
var i = start;
var result = args[start].apply(this, arguments);
while (i--) result = args[i].call(this, result);
return result;
};
};
 
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
return function() {
if (--times < 1) {
return func.apply(this, arguments);
}
};
};
 
// Returns a function that will only be executed before being called N times.
_.before = function(times, func) {
var memo;
return function() {
if (--times > 0) {
memo = func.apply(this, arguments);
} else {
func = null;
}
return memo;
};
};
 
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
_.once = _.partial(_.before, 2);
 
// Object Functions
// ----------------
 
// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
var hasEnumBug = !({toString: null}).propertyIsEnumerable('toString');
var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString',
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
 
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = function(obj) {
if (!_.isObject(obj)) return [];
if (nativeKeys) return nativeKeys(obj);
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys.push(key);
 
// Ahem, IE < 9.
if (hasEnumBug) {
var nonEnumIdx = nonEnumerableProps.length;
while (nonEnumIdx--) {
var prop = nonEnumerableProps[nonEnumIdx];
if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
}
}
return keys;
};
 
// Retrieve the values of an object's properties.
_.values = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
var values = Array(length);
for (var i = 0; i < length; i++) {
values[i] = obj[keys[i]];
}
return values;
};
 
// Convert an object into a list of `[key, value]` pairs.
_.pairs = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
var pairs = Array(length);
for (var i = 0; i < length; i++) {
pairs[i] = [keys[i], obj[keys[i]]];
}
return pairs;
};
 
// Invert the keys and values of an object. The values must be serializable.
_.invert = function(obj) {
var result = {};
var keys = _.keys(obj);
for (var i = 0, length = keys.length; i < length; i++) {
result[obj[keys[i]]] = keys[i];
}
return result;
};
 
// Return a sorted list of the function names available on the object.
// Aliased as `methods`
_.functions = _.methods = function(obj) {
var names = [];
for (var key in obj) {
if (_.isFunction(obj[key])) names.push(key);
}
return names.sort();
};
 
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
if (!_.isObject(obj)) return obj;
var source, prop;
for (var i = 1, length = arguments.length; i < length; i++) {
source = arguments[i];
for (prop in source) {
obj[prop] = source[prop];
}
}
return obj;
};
 
// Return a copy of the object only containing the whitelisted properties.
_.pick = function(obj, iteratee, context) {
var result = {}, key;
if (obj == null) return result;
if (_.isFunction(iteratee)) {
iteratee = optimizeCb(iteratee, context);
for (key in obj) {
var value = obj[key];
if (iteratee(value, key, obj)) result[key] = value;
}
} else {
var keys = flatten(arguments, false, false, 1);
obj = new Object(obj);
for (var i = 0, length = keys.length; i < length; i++) {
key = keys[i];
if (key in obj) result[key] = obj[key];
}
}
return result;
};
 
// Return a copy of the object without the blacklisted properties.
_.omit = function(obj, iteratee, context) {
if (_.isFunction(iteratee)) {
iteratee = _.negate(iteratee);
} else {
var keys = _.map(flatten(arguments, false, false, 1), String);
iteratee = function(value, key) {
return !_.contains(keys, key);
};
}
return _.pick(obj, iteratee, context);
};
 
// Fill in a given object with default properties.
_.defaults = function(obj) {
if (!_.isObject(obj)) return obj;
for (var i = 1, length = arguments.length; i < length; i++) {
var source = arguments[i];
for (var prop in source) {
if (obj[prop] === void 0) obj[prop] = source[prop];
}
}
return obj;
};
 
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
 
// Invokes interceptor with the obj, and then returns obj.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
 
// Internal recursive comparison function for `isEqual`.
var eq = function(a, b, aStack, bStack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
if (a === b) return a !== 0 || 1 / a === 1 / b;
// A strict comparison is necessary because `null == undefined`.
if (a == null || b == null) return a === b;
// Unwrap any wrapped objects.
if (a instanceof _) a = a._wrapped;
if (b instanceof _) b = b._wrapped;
// Compare `[[Class]]` names.
var className = toString.call(a);
if (className !== toString.call(b)) return false;
switch (className) {
// Strings, numbers, regular expressions, dates, and booleans are compared by value.
case '[object RegExp]':
// RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
case '[object String]':
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
// equivalent to `new String("5")`.
return '' + a === '' + b;
case '[object Number]':
// `NaN`s are equivalent, but non-reflexive.
// Object(NaN) is equivalent to NaN
if (+a !== +a) return +b !== +b;
// An `egal` comparison is performed for other numeric values.
return +a === 0 ? 1 / +a === 1 / b : +a === +b;
case '[object Date]':
case '[object Boolean]':
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
// millisecond representations. Note that invalid dates with millisecond representations
// of `NaN` are not equivalent.
return +a === +b;
}
 
var areArrays = className === '[object Array]';
if (!areArrays) {
if (typeof a != 'object' || typeof b != 'object') return false;
 
// Objects with different constructors are not equivalent, but `Object`s or `Array`s
// from different frames are.
var aCtor = a.constructor, bCtor = b.constructor;
if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
_.isFunction(bCtor) && bCtor instanceof bCtor)
&& ('constructor' in a && 'constructor' in b)) {
return false;
}
}
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
var length = aStack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
if (aStack[length] === a) return bStack[length] === b;
}
 
// Add the first object to the stack of traversed objects.
aStack.push(a);
bStack.push(b);
var size, result;
// Recursively compare objects and arrays.
if (areArrays) {
// Compare array lengths to determine if a deep comparison is necessary.
size = a.length;
result = size === b.length;
if (result) {
// Deep compare the contents, ignoring non-numeric properties.
while (size--) {
if (!(result = eq(a[size], b[size], aStack, bStack))) break;
}
}
} else {
// Deep compare objects.
var keys = _.keys(a), key;
size = keys.length;
// Ensure that both objects contain the same number of properties before comparing deep equality.
result = _.keys(b).length === size;
if (result) {
while (size--) {
// Deep compare each member
key = keys[size];
if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
}
}
}
// Remove the first object from the stack of traversed objects.
aStack.pop();
bStack.pop();
return result;
};
 
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
return eq(a, b, [], []);
};
 
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
_.isEmpty = function(obj) {
if (obj == null) return true;
if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
for (var key in obj) if (_.has(obj, key)) return false;
return true;
};
 
// Is a given value a DOM element?
_.isElement = function(obj) {
return !!(obj && obj.nodeType === 1);
};
 
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) === '[object Array]';
};
 
// Is a given variable an object?
_.isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};
 
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
_['is' + name] = function(obj) {
return toString.call(obj) === '[object ' + name + ']';
};
});
 
// Define a fallback version of the method in browsers (ahem, IE < 9), where
// there isn't any inspectable "Arguments" type.
if (!_.isArguments(arguments)) {
_.isArguments = function(obj) {
return _.has(obj, 'callee');
};
}
 
// Optimize `isFunction` if appropriate. Work around an IE 11 bug.
if (typeof /./ !== 'function') {
_.isFunction = function(obj) {
return typeof obj == 'function' || false;
};
}
 
// Is a given object a finite number?
_.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};
 
// Is the given value `NaN`? (NaN is the only number which does not equal itself).
_.isNaN = function(obj) {
return _.isNumber(obj) && obj !== +obj;
};
 
// Is a given value a boolean?
_.isBoolean = function(obj) {
return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
};
 
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
};
 
// Is a given variable undefined?
_.isUndefined = function(obj) {
return obj === void 0;
};
 
// Shortcut function for checking if an object has a given property directly
// on itself (in other words, not on a prototype).
_.has = function(obj, key) {
return obj != null && hasOwnProperty.call(obj, key);
};
 
// Utility Functions
// -----------------
 
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
// previous owner. Returns a reference to the Underscore object.
_.noConflict = function() {
root._ = previousUnderscore;
return this;
};
 
// Keep the identity function around for default iteratees.
_.identity = function(value) {
return value;
};
 
// Predicate-generating functions. Often useful outside of Underscore.
_.constant = function(value) {
return function() {
return value;
};
};
 
_.noop = function(){};
 
_.property = function(key) {
return function(obj) {
return obj == null ? void 0 : obj[key];
};
};
 
// Returns a predicate for checking whether an object has a given set of `key:value` pairs.
_.matches = function(attrs) {
var pairs = _.pairs(attrs), length = pairs.length;
return function(obj) {
if (obj == null) return !length;
obj = new Object(obj);
for (var i = 0; i < length; i++) {
var pair = pairs[i], key = pair[0];
if (pair[1] !== obj[key] || !(key in obj)) return false;
}
return true;
};
};
 
// Run a function **n** times.
_.times = function(n, iteratee, context) {
var accum = Array(Math.max(0, n));
iteratee = optimizeCb(iteratee, context, 1);
for (var i = 0; i < n; i++) accum[i] = iteratee(i);
return accum;
};
 
// Return a random integer between min and max (inclusive).
_.random = function(min, max) {
if (max == null) {
max = min;
min = 0;
}
return min + Math.floor(Math.random() * (max - min + 1));
};
 
// A (possibly faster) way to get the current timestamp as an integer.
_.now = Date.now || function() {
return new Date().getTime();
};
 
// List of HTML entities for escaping.
var escapeMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#x27;',
'`': '&#x60;'
};
var unescapeMap = _.invert(escapeMap);
 
// Functions for escaping and unescaping strings to/from HTML interpolation.
var createEscaper = function(map) {
var escaper = function(match) {
return map[match];
};
// Regexes for identifying a key that needs to be escaped
var source = '(?:' + _.keys(map).join('|') + ')';
var testRegexp = RegExp(source);
var replaceRegexp = RegExp(source, 'g');
return function(string) {
string = string == null ? '' : '' + string;
return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
};
};
_.escape = createEscaper(escapeMap);
_.unescape = createEscaper(unescapeMap);
 
// If the value of the named `property` is a function then invoke it with the
// `object` as context; otherwise, return it.
_.result = function(object, property, fallback) {
var value = object == null ? void 0 : object[property];
if (value === void 0) {
return fallback;
}
return _.isFunction(value) ? object[property]() : value;
};
 
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
var id = ++idCounter + '';
return prefix ? prefix + id : id;
};
 
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
 
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
 
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
 
var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
 
var escapeChar = function(match) {
return '\\' + escapes[match];
};
 
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
// NB: `oldSettings` only exists for backwards compatibility.
_.template = function(text, settings, oldSettings) {
if (!settings && oldSettings) settings = oldSettings;
settings = _.defaults({}, settings, _.templateSettings);
 
// Combine delimiters into one regular expression via alternation.
var matcher = RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
 
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset).replace(escaper, escapeChar);
index = offset + match.length;
 
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
} else if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
} else if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
 
// Adobe VMs need the match returned to produce the correct offest.
return match;
});
source += "';\n";
 
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
 
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + 'return __p;\n';
 
try {
var render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
 
var template = function(data) {
return render.call(this, data, _);
};
 
// Provide the compiled source as a convenience for precompilation.
var argument = settings.variable || 'obj';
template.source = 'function(' + argument + '){\n' + source + '}';
 
return template;
};
 
// Add a "chain" function. Start chaining a wrapped Underscore object.
_.chain = function(obj) {
var instance = _(obj);
instance._chain = true;
return instance;
};
 
// OOP
// ---------------
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
 
// Helper function to continue chaining intermediate results.
var result = function(instance, obj) {
return instance._chain ? _(obj).chain() : obj;
};
 
// Add your own custom functions to the Underscore object.
_.mixin = function(obj) {
_.each(_.functions(obj), function(name) {
var func = _[name] = obj[name];
_.prototype[name] = function() {
var args = [this._wrapped];
push.apply(args, arguments);
return result(this, func.apply(_, args));
};
});
};
 
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
 
// Add all mutator Array functions to the wrapper.
_.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
var obj = this._wrapped;
method.apply(obj, arguments);
if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
return result(this, obj);
};
});
 
// Add all accessor Array functions to the wrapper.
_.each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
return result(this, method.apply(this._wrapped, arguments));
};
});
 
// Extracts the result from a wrapped and chained object.
_.prototype.value = function() {
return this._wrapped;
};
 
// AMD registration happens at the end for compatibility with AMD loaders
// that may not enforce next-turn semantics on modules. Even though general
// practice for AMD registration is to be anonymous, underscore registers
// as a named module because, like jQuery, it is a base library that is
// popular enough to be bundled in a third party lib, but not be part of
// an AMD load request. Those cases could generate an error when an
// anonymous define() is called outside of a loader request.
if (typeof define === 'function' && define.amd) {
define('underscore', [], function() {
return _;
});
}
}.call(this));