aboutsummaryrefslogtreecommitdiff
path: root/vendors/lessphp/tests
diff options
context:
space:
mode:
authorSilvio Rhatto <rhatto@riseup.net>2014-03-15 14:42:42 -0300
committerSilvio Rhatto <rhatto@riseup.net>2014-03-15 14:42:42 -0300
commit551497ef94f6239b109316d8fab32f0909b13f73 (patch)
tree236615e9881988ce05f40583ff891bf0fcef2c14 /vendors/lessphp/tests
downloadelgg-551497ef94f6239b109316d8fab32f0909b13f73.tar.gz
elgg-551497ef94f6239b109316d8fab32f0909b13f73.tar.bz2
Squashed 'mod/less/' content from commit 380edad
git-subtree-dir: mod/less git-subtree-split: 380edadb3a5e524a8e6ef6df063b678f2f00516f
Diffstat (limited to 'vendors/lessphp/tests')
-rw-r--r--vendors/lessphp/tests/README.md24
-rwxr-xr-xvendors/lessphp/tests/bootstrap.sh49
-rw-r--r--vendors/lessphp/tests/inputs/accessors.less.disable36
-rw-r--r--vendors/lessphp/tests/inputs/arity.less77
-rw-r--r--vendors/lessphp/tests/inputs/attributes.less41
-rw-r--r--vendors/lessphp/tests/inputs/builtins.less36
-rw-r--r--vendors/lessphp/tests/inputs/colors.less122
-rw-r--r--vendors/lessphp/tests/inputs/compile_on_mixin.less39
-rw-r--r--vendors/lessphp/tests/inputs/escape.less20
-rw-r--r--vendors/lessphp/tests/inputs/font_family.less28
-rw-r--r--vendors/lessphp/tests/inputs/guards.less88
-rw-r--r--vendors/lessphp/tests/inputs/hacks.less6
-rw-r--r--vendors/lessphp/tests/inputs/import.less21
-rw-r--r--vendors/lessphp/tests/inputs/keyframes.less52
-rw-r--r--vendors/lessphp/tests/inputs/math.less116
-rw-r--r--vendors/lessphp/tests/inputs/media.less38
-rw-r--r--vendors/lessphp/tests/inputs/misc.less84
-rw-r--r--vendors/lessphp/tests/inputs/mixin_functions.less40
-rw-r--r--vendors/lessphp/tests/inputs/mixin_merging.less.disable100
-rw-r--r--vendors/lessphp/tests/inputs/mixins.less126
-rw-r--r--vendors/lessphp/tests/inputs/nested.less60
-rw-r--r--vendors/lessphp/tests/inputs/pattern_matching.less167
-rw-r--r--vendors/lessphp/tests/inputs/scopes.less40
-rw-r--r--vendors/lessphp/tests/inputs/selector_expressions.less29
-rw-r--r--vendors/lessphp/tests/inputs/site_demos.less120
-rw-r--r--vendors/lessphp/tests/inputs/test-imports/file1.less16
-rw-r--r--vendors/lessphp/tests/inputs/test-imports/file2.less6
-rw-r--r--vendors/lessphp/tests/inputs/variables.less45
-rw-r--r--vendors/lessphp/tests/outputs/accessors.css14
-rw-r--r--vendors/lessphp/tests/outputs/arity.css25
-rw-r--r--vendors/lessphp/tests/outputs/attributes.css35
-rw-r--r--vendors/lessphp/tests/outputs/builtins.css20
-rw-r--r--vendors/lessphp/tests/outputs/colors.css69
-rw-r--r--vendors/lessphp/tests/outputs/compile_on_mixin.css11
-rw-r--r--vendors/lessphp/tests/outputs/escape.css14
-rw-r--r--vendors/lessphp/tests/outputs/font_family.css17
-rw-r--r--vendors/lessphp/tests/outputs/guards.css23
-rw-r--r--vendors/lessphp/tests/outputs/hacks.css1
-rw-r--r--vendors/lessphp/tests/outputs/import.css14
-rw-r--r--vendors/lessphp/tests/outputs/keyframes.css47
-rw-r--r--vendors/lessphp/tests/outputs/math.css61
-rw-r--r--vendors/lessphp/tests/outputs/media.css28
-rw-r--r--vendors/lessphp/tests/outputs/misc.css40
-rw-r--r--vendors/lessphp/tests/outputs/mixin_functions.css14
-rw-r--r--vendors/lessphp/tests/outputs/mixin_merging.css42
-rw-r--r--vendors/lessphp/tests/outputs/mixins.css50
-rw-r--r--vendors/lessphp/tests/outputs/nested.css16
-rw-r--r--vendors/lessphp/tests/outputs/nesting.css6
-rw-r--r--vendors/lessphp/tests/outputs/pattern_matching.css56
-rw-r--r--vendors/lessphp/tests/outputs/scopes.css7
-rw-r--r--vendors/lessphp/tests/outputs/selector_expressions.css8
-rw-r--r--vendors/lessphp/tests/outputs/site_demos.css54
-rw-r--r--vendors/lessphp/tests/outputs/variables.css20
-rw-r--r--vendors/lessphp/tests/sort.php57
-rw-r--r--vendors/lessphp/tests/test.php190
55 files changed, 2565 insertions, 0 deletions
diff --git a/vendors/lessphp/tests/README.md b/vendors/lessphp/tests/README.md
new file mode 100644
index 000000000..edb8f7be3
--- /dev/null
+++ b/vendors/lessphp/tests/README.md
@@ -0,0 +1,24 @@
+## test.php
+
+To run:
+
+ php test.php [flags] [test-name-glob]
+
+
+Runs through all files in `inputs`, compiles them, then compares to respective
+file in `outputs`. If there are any differences then the test will fail.
+
+Add the `-d` flag to show the differences of failed tests. Defaults to showing
+differences with `diff` but you can set the tool by doing `-d=toolname`.
+
+Pass the `-C` flag to save the output of the inputs to the appropriate file. This
+will overwrite any existing outputs. Use this when you want to save verified
+test results. Combine with a *test-name-glob* to selectively compile.
+
+You can also run specific tests by passing in an argument that contains any
+part of the test name.
+
+## bootstrap.sh
+
+It's a syntetic test comparing lessc and lessphp output compiling twitter bootstrap;
+see bootstrap.sh for details. \ No newline at end of file
diff --git a/vendors/lessphp/tests/bootstrap.sh b/vendors/lessphp/tests/bootstrap.sh
new file mode 100755
index 000000000..b49f7cec3
--- /dev/null
+++ b/vendors/lessphp/tests/bootstrap.sh
@@ -0,0 +1,49 @@
+echo "This script clones twitter bootsrap, compiles it with lessc and lessphp,"
+echo "cleans up results with csstidy, and outputs diff. To run it, you need to"
+echo "have git, csstidy and lessc installed."
+echo ""
+
+csstidy_params="--allow_html_in_templates=false --compress_colors=false
+--compress_font-weight=false --discard_invalid_properties=false
+--lowercase_s=false --preserve_css=true --remove_bslash=false
+--remove_last_;=false --sort-properties=true --sort-selectors=true
+--timestamp=false --silent=true --merge_selectors=0 --case-properties=0
+--optimize-shorthands=0 --template=high"
+
+if [ -z "$@" ]; then
+ diff_tool="diff -b -u -t -B"
+else
+ diff_tool=$@
+fi
+
+mkdir -p tmp
+
+if [ ! -d 'bootstrap/' ]; then
+ echo ">> Cloning bootstrap to bootstrap/"
+ git clone https://github.com/twitter/bootstrap
+fi
+
+echo ">> Lessc compilation"
+lessc bootstrap/less/bootstrap.less tmp/bootstrap.lessc.css
+
+echo ">> Lessphp compilation"
+../plessc bootstrap/less/bootstrap.less tmp/bootstrap.lessphp.css
+echo ">> Cleanup and convert"
+
+# csstidy tmp/bootstrap.lessc.css $csstidy_params tmp/bootstrap.lessc.clean.css
+# csstidy tmp/bootstrap.lessphp.css $csstidy_params tmp/bootstrap.lessphp.clean.css
+#
+# # put a newline after { and :
+# function split() {
+# sed 's/\(;\|{\)/\1\n/g'
+# }
+#
+# # csstidy is messed up and wont output to stdout when there are a bunch of options
+# cat tmp/bootstrap.lessc.clean.css | split | tee tmp/bootstrap.lessc.clean.css
+# cat tmp/bootstrap.lessphp.clean.css | split | tee tmp/bootstrap.lessphp.clean.css
+
+php sort.php tmp/bootstrap.lessc.css > tmp/bootstrap.lessc.clean.css
+php sort.php tmp/bootstrap.lessphp.css > tmp/bootstrap.lessphp.clean.css
+
+echo ">> Doing diff"
+$diff_tool tmp/bootstrap.lessc.clean.css tmp/bootstrap.lessphp.clean.css
diff --git a/vendors/lessphp/tests/inputs/accessors.less.disable b/vendors/lessphp/tests/inputs/accessors.less.disable
new file mode 100644
index 000000000..37f5c8e8b
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/accessors.less.disable
@@ -0,0 +1,36 @@
+/* accessors */
+
+#defaults {
+ @width: 960px;
+ @color: black;
+ .something {
+ @space: 10px;
+ @hello {
+ color: green;
+ }
+ }
+}
+
+.article { color: #294366; }
+
+.comment {
+ width: #defaults[@width];
+ color: .article['color'];
+ padding: #defaults > .something[@space];
+}
+
+.wow {
+ height: .comment['width'];
+ background-color: .comment['color'];
+ color: #defaults > .something > @hello['color'];
+
+ padding: #defaults > non-existant['padding'];
+ margin: #defaults > .something['non-existant'];
+}
+
+.mix {
+ #defaults;
+ font-size: .something[@space];
+}
+
+
diff --git a/vendors/lessphp/tests/inputs/arity.less b/vendors/lessphp/tests/inputs/arity.less
new file mode 100644
index 000000000..a3adad612
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/arity.less
@@ -0,0 +1,77 @@
+
+// simple arity
+
+.hello(@a) {
+ color: one;
+}
+
+.hello(@a, @b) {
+ color: two;
+}
+
+.hello(@a, @b, @c) {
+ color: three;
+}
+
+
+.world(@a, @b, @c) {
+ color: three;
+}
+
+.world(@a, @b) {
+ color: two;
+}
+
+.world(@a) {
+ color: one;
+}
+
+.one {
+ .hello(1);
+ .world(1);
+}
+
+.two {
+ .hello(1, 1);
+ .world(1, 1);
+}
+
+.three {
+ .hello(1, 1, 1);
+ .world(1, 1, 1);
+}
+
+
+// arity with default values
+
+.foo(@a, @b: cool) {
+ color: two;
+}
+
+.foo(@a, @b: cool, @c: yeah) {
+ color: three;
+}
+
+
+.baz(@a, @b, @c: yeah) {
+ color: three;
+}
+
+.baz(@a, @b: cool) {
+ color: two;
+}
+
+
+.multi-foo {
+ .foo(1);
+ .foo(1, 1);
+ .foo(1,1,1);
+}
+
+.multi-baz {
+ .baz(1);
+ .baz(1, 1);
+ .baz(1,1,1);
+}
+
+
diff --git a/vendors/lessphp/tests/inputs/attributes.less b/vendors/lessphp/tests/inputs/attributes.less
new file mode 100644
index 000000000..7ede4fc4e
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/attributes.less
@@ -0,0 +1,41 @@
+* { color: blue; }
+E { color: blue; }
+E[foo] { color: blue; }
+[foo] { color: blue; }
+[foo] .helloWorld { color: blue; }
+[foo].helloWorld { color: blue; }
+E[foo="barbar"] { color: blue; }
+E[foo~="hello#$@%@$#^"] { color: blue; }
+E[foo^="color: green;"] { color: blue; }
+E[foo$="239023"] { color: blue; }
+E[foo*="29302"] { color: blue; }
+E[foo|="239032"] { color: blue; }
+E:root { color: blue; }
+
+E:nth-child(odd) { color: blue; }
+E:nth-child(2n+1) { color: blue; }
+E:nth-child(5) { color: blue; }
+E:nth-last-child(-n+2) { color: blue; }
+E:nth-of-type(2n) { color: blue; }
+E:nth-last-of-type(n) { color: blue; }
+
+E:first-child { color: blue; }
+E:last-child { color: blue; }
+E:first-of-type { color: blue; }
+E:last-of-type { color: blue; }
+E:only-child { color: blue; }
+E:only-of-type { color: blue; }
+E:empty { color: blue; }
+
+E:lang(en) { color: blue; }
+E::first-line { color: blue; }
+E::before { color: blue; }
+
+E#id { color: blue; }
+E:not(:link) { color: blue; }
+
+E F { color: blue; }
+E > F { color: blue; }
+E + F { color: blue; }
+E ~ F { color: blue; }
+
diff --git a/vendors/lessphp/tests/inputs/builtins.less b/vendors/lessphp/tests/inputs/builtins.less
new file mode 100644
index 000000000..ae2c4ef6e
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/builtins.less
@@ -0,0 +1,36 @@
+// builtin
+
+@something: "hello world";
+@color: #112233;
+@color2: rgba(44,55,66, .6);
+
+body {
+ color: @something;
+
+ @num: 7 / 6;
+ height: @num + 4;
+ height: floor(@num) + 4px;
+ height: ceil(@num) + 4px;
+
+ @num2: 2 / 3;
+ width: @num2;
+ width: round(@num2);
+ width: floor(@num2);
+ width: ceil(@num2);
+ width: round(10px / 3);
+
+ color: rgbahex(@color);
+ color: rgbahex(@color2);
+}
+
+
+format {
+ @r: 32;
+ format: %("rgb(%d, %d, %d)", @r, 128, 64);
+ format-string: %("hello %s", "world");
+ format-multiple: %("hello %s %d", "earth", 2);
+ format-url-encode: %('red is %A', #ff0000);
+ eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64));
+}
+
+
diff --git a/vendors/lessphp/tests/inputs/colors.less b/vendors/lessphp/tests/inputs/colors.less
new file mode 100644
index 000000000..d407a74f3
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/colors.less
@@ -0,0 +1,122 @@
+
+body {
+ color: hsl(34, 50%, 40%);
+ color: hsla(34, 50%, 40%, 0.3);
+
+ lighten: lighten(#efefef, 10%);
+ lighten: lighten(rgb(23, 53, 231), 22%);
+ lighten: lighten(rgba(212, 103, 88, 0.5), 10%);
+
+ darken: darken(#efefef, 10%);
+ darken: darken(rgb(23, 53, 231), 22%);
+ darken: darken(rgba(23, 53, 231, 0.5), 10%);
+
+ saturate: saturate(#efefef, 10%);
+ saturate: saturate(rgb(23, 53, 231), 22%);
+ saturate: saturate(rgba(23, 53, 231, 0.5), 10%);
+
+ desaturate: desaturate(#efefef, 10%);
+ desaturate: desaturate(rgb(23, 53, 231), 22%);
+ desaturate: desaturate(rgba(23, 53, 231, 0.5), 10%);
+
+ spin: spin(#efefef, 12);
+ spin: spin(rgb(23, 53, 231), 15);
+ spin: spin(rgba(23, 53, 231, 0.5), 19);
+
+ spin: spin(#efefef, -12);
+ spin: spin(rgb(23, 53, 231), -15);
+ spin: spin(rgba(23, 53, 231, 0.5), -19);
+
+ one: fadein(#abcdef, 10%);
+ one: fadeout(#abcdef, -10%);
+
+ two: fadeout(#029f23, 10%);
+ two: fadein(#029f23, -10%);
+
+
+ three: fadein(rgba(1,2,3, 0.5), 10%);
+ three: fadeout(rgba(1,2,3, 0.5), -10%);
+
+ four: fadeout(rgba(1,2,3, 0), 10%);
+ four: fadein(rgba(1,2,3, 0), -10%);
+
+ hue: hue(rgb(34,20,40));
+ sat: saturation(rgb(34,20,40));
+ lit: lightness(rgb(34,20,40));
+
+ @old: #34fa03;
+ @new: hsl(hue(@old), 45%, 90%);
+ what: @new;
+
+ zero: saturate(#123456, -100%);
+ zero: saturate(#123456, 100%);
+ zero: saturate(#000000, 100%);
+ zero: saturate(#ffffff, 100%);
+
+ zero: lighten(#123456, -100%);
+ zero: lighten(#123456, 100%);
+ zero: lighten(#000000, 100%);
+ zero: lighten(#ffffff, 100%);
+
+ zero: spin(#123456, -100);
+ zero: spin(#123456, 100);
+ zero: spin(#000000, 100);
+ zero: spin(#ffffff, 100);
+}
+
+
+alpha {
+ // g: alpha(red);
+ g: alpha(rgba(0,0,0,0));
+ g: alpha(rgb(155,55,0));
+}
+
+fade {
+ f: fade(red, 50%);
+ f: fade(#fff, 20%);
+ f: fade(rgba(34,23,64,0.4), 50%);
+}
+
+@a: rgb(255,255,255);
+@b: rgb(0,0,0);
+
+.mix {
+ color: mix(@a, @b, 50%);
+}
+
+.percent {
+ per: percentage(0.5);
+}
+
+// color keywords
+
+.colorz {
+ color: whitesmoke - 10;
+ color: spin(red, 34);
+}
+
+
+
+// purposfuly whacky to match less.js
+
+@color: #fcf8e3;
+
+body {
+ start: @color;
+ spin: spin(@color, -10); // #fcf4e3
+ chained: darken(spin(@color, -10), 3%); // gives #fbeed5, should be #fbefd5
+ direct: darken(#fcf4e3, 3%); // #fbefd5
+}
+
+// spin around
+pre {
+ @errorBackground: #f2dede;
+ spin: spin(@errorBackground, -10);
+}
+
+dd {
+ @white: #fff;
+ background-color: mix(@white, darken(@white, 10%), 60%);
+}
+
+
diff --git a/vendors/lessphp/tests/inputs/compile_on_mixin.less b/vendors/lessphp/tests/inputs/compile_on_mixin.less
new file mode 100644
index 000000000..79d628f49
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/compile_on_mixin.less
@@ -0,0 +1,39 @@
+
+@mixin {
+ height: 22px;
+ ul {
+ height: 20px;
+ li {
+ @color: red;
+ height: 10px;
+ div span, link {
+ margin: 10px;
+ color: @color;
+ }
+ }
+
+ div, p {
+ border: 1px;
+ &.hello {
+ color: green;
+ }
+
+ :what {
+ color: blue;
+ }
+ }
+
+
+ a {
+ b {
+ color: blue;
+ }
+ }
+ }
+}
+
+
+
+body {
+ @mixin;
+}
diff --git a/vendors/lessphp/tests/inputs/escape.less b/vendors/lessphp/tests/inputs/escape.less
new file mode 100644
index 000000000..02d92d6f0
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/escape.less
@@ -0,0 +1,20 @@
+
+body {
+ @hello: "world";
+ border: e("this is simple");
+ border: e(this is simple); // bug in lessjs
+ border: e("this is simple", "cool lad");
+ border: e(1232);
+ border: e(@hello);
+ border: e("one" + 'more'); // no string addition lessjs
+ border: e(); // syntax error lessjs
+
+ line-height: ~"eating rice";
+ line-height: ~"string cheese";
+ line-height: a b c ~"string me" d e f;
+ line-height: ~"string @{hello}";
+}
+
+.class {
+ filter: ~"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png')";
+}
diff --git a/vendors/lessphp/tests/inputs/font_family.less b/vendors/lessphp/tests/inputs/font_family.less
new file mode 100644
index 000000000..c7186b57b
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/font_family.less
@@ -0,0 +1,28 @@
+
+@font-directory: 'fonts/';
+@some-family: Gentium;
+
+@font-face: maroon; // won't collide with @font-face { }
+
+@font-face {
+ font-family: Graublau Sans Web;
+ src: url(@{font-directory}GraublauWeb.otf) format("opentype");
+}
+
+@font-face {
+ font-family: @some-family;
+ src: url('@{font-directory}Gentium.ttf');
+}
+
+@font-face {
+ font-family: @some-family;
+ src: url("@{font-directory}GentiumItalic.ttf");
+ font-style: italic;
+}
+
+h2 {
+ font-family: @some-family;
+ crazy: @font-face;
+}
+
+
diff --git a/vendors/lessphp/tests/inputs/guards.less b/vendors/lessphp/tests/inputs/guards.less
new file mode 100644
index 000000000..20bdf240e
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/guards.less
@@ -0,0 +1,88 @@
+
+.simple(@hi) when (@hi) {
+ color: yellow;
+}
+
+
+.something(@hi) when (@hi = cool) {
+ color: red;
+}
+
+.another(@x) when (@x > 10) {
+ color: green;
+}
+
+
+.flipped(@x) when (@x =< 10) {
+ color: teal;
+}
+
+.yeah(@arg) when (isnumber(@arg)) {
+ color: purple;
+}
+
+
+.yeah(@arg) when (ispixel(@arg)) {
+ color: silver;
+}
+
+
+.hello(@arg) when not (@arg) {
+ color: orange;
+}
+
+dd {
+ .simple(true);
+ .simple(2344px);
+}
+
+b {
+ .something(cool);
+ .something(birthday);
+}
+
+img {
+ .another(12);
+ .another(2);
+
+ .flipped(12);
+ .flipped(2);
+}
+
+body {
+ .yeah("world");
+ .yeah(232px);
+ .yeah(232);
+
+ .hello(true);
+}
+
+.something(@x) when (@x) and (@y), not (@x = what) {
+ color: blue;
+}
+
+div {
+ @y: true;
+ .something(true);
+
+}
+
+pre {
+ .something(what);
+}
+
+
+.coloras(@g) when (iscolor(@g)) {
+ color: true @g;
+}
+
+link {
+ .coloras(red);
+ .coloras(10px);
+ .coloras(ffjref);
+ .coloras(#fff);
+ .coloras(#fffddd);
+ .coloras(rgb(0,0,0));
+ .coloras(rgba(0,0,0, .34));
+}
+
diff --git a/vendors/lessphp/tests/inputs/hacks.less b/vendors/lessphp/tests/inputs/hacks.less
new file mode 100644
index 000000000..e69b7bf98
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/hacks.less
@@ -0,0 +1,6 @@
+// css hacks
+
+:root .alert-message, :root .btn {
+ border-radius: 0 \0;
+}
+
diff --git a/vendors/lessphp/tests/inputs/import.less b/vendors/lessphp/tests/inputs/import.less
new file mode 100644
index 000000000..250d1a3f3
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/import.less
@@ -0,0 +1,21 @@
+
+@import 'file1.less'; // file found and imported
+
+@import "something.css" media;
+@import url("something.css") media;
+@import url(something.css) media, screen, print;
+
+@color: maroon;
+
+@import url(file2); // found and imported
+
+body {
+ line-height: 10em;
+ @colors;
+}
+
+div {
+ @color: fuchsia;
+ @import "file2";
+}
+
diff --git a/vendors/lessphp/tests/inputs/keyframes.less b/vendors/lessphp/tests/inputs/keyframes.less
new file mode 100644
index 000000000..e65a38b95
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/keyframes.less
@@ -0,0 +1,52 @@
+@keyframes 'bounce' {
+ from {
+ top: 100px;
+ animation-timing-function: ease-out;
+ }
+
+ 25% {
+ top: 50px;
+ animation-timing-function: ease-in;
+ }
+
+ 50% {
+ top: 100px;
+ animation-timing-function: ease-out;
+ }
+
+ 75% {
+ top: 75px;
+ animation-timing-function: ease-in;
+ }
+
+ to {
+ top: 100px;
+ }
+}
+
+@-webkit-keyframes flowouttoleft {
+ 0% { -webkit-transform: translateX(0) scale(1); }
+ 60%, 70% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(-100%) scale(.7); }
+}
+
+div {
+ animation-name: 'diagonal-slide';
+ animation-duration: 5s;
+ animation-iteration-count: 10;
+}
+
+@keyframes 'diagonal-slide' {
+
+ from {
+ left: 0;
+ top: 0;
+ }
+
+ to {
+ left: 100px;
+ top: 100px;
+ }
+
+}
+
diff --git a/vendors/lessphp/tests/inputs/math.less b/vendors/lessphp/tests/inputs/math.less
new file mode 100644
index 000000000..3f4af2c7d
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/math.less
@@ -0,0 +1,116 @@
+
+.unary {
+ // all operators are parsable as unary operators, anything
+ // but - throws an error right now though,
+
+ // this gives two numbers
+ sub: 10 -5;
+ // add: 10 +5; // error
+ // div: 10 /5; // error
+ // mul: 10 *5; // error
+}
+
+.spaces {
+ // we can make the parser do math by leaving out the
+ // space after the first value, or putting spaces on both sides
+
+ sub: 10-5;
+ sub: 10 - 5;
+
+ add: 10+5;
+ add: 10 + 5;
+
+ // div: 10/5; // this wont work, read on
+ div: 10 / 5;
+
+ mul: 10*5;
+ mul: 10 * 5;
+}
+
+// these properties have divison not in parenthases
+.supress-division {
+ border-radius: 10px / 10px;
+ border-radius: 10px/10px;
+ border-radius: hello (10px/10px) world;
+ @x: 10px;
+ font: @x/30 sans-serif;
+ font: 10px / 20px sans-serif;
+ font: 10px/20px sans-serif;
+ border-radius:0 15px 15px 15px / 0 50% 50% 50%;
+}
+
+
+.parens {
+ // if you are unsure, then just wrap the expression in parentheses and it will
+ // always evaluate.
+
+ // notice we no longer have unary operators, and these will evaluate
+ sub: (10 -5);
+ add: (10 +5);
+ div: (10 /5);
+ div: (10/5); // no longer interpreted as the shorthand
+ mul: (10 *5);
+}
+
+.keyword-names {
+ // watch out when doing math with keywords, - is a valid keyword character
+ @a: 100;
+ @b: 25;
+ @a-: "hello";
+ height: @a-@b; // here we get "hello" 25, not 75
+}
+
+
+.negation {
+ hello: -(1px);
+ hello: 0-(1px);
+
+ @something: 10;
+ hello: -@something;
+}
+
+
+// and now here are the tests
+
+.test {
+ single: (5);
+ single: 5+(5);
+ single: (5)+((5));
+
+ parens: (5 +(5)) -2;
+ // parens: ((5 +(5)) -2); // FAILS - fixme
+
+ math: (5 + 5)*(2 / 1);
+ math: (5+5)*(2/1);
+
+ width: 2 * (4 * (2 + (1 + 6))) - 1;
+ height: ((2+3)*(2+3) / (9-4)) + 1;
+ padding: (2px + 4px) 1em 2px 2;
+
+ @var: (2 * 2);
+ padding: (2 * @var) 4 4 (@var * 1px);
+ width: (@var * @var) * 6;
+ height: (7 * 7) + (8 * 8);
+ margin: 4 * (5 + 5) / 2 - (@var * 2);
+}
+
+.percents {
+ color: 100 * 10%;
+ color: 10% * 100;
+ color: 10% * 10%;
+
+ color: 100px * 10%; // lessjs makes this px
+ color: 10% * 100px; // lessjs makes this %
+
+ color: 20% + 10%;
+ color: 20% - 10%;
+
+ color: 20% / 10%;
+}
+
+.misc {
+ x: 10px * 4em;
+ y: 10 * 4em;
+
+}
+
diff --git a/vendors/lessphp/tests/inputs/media.less b/vendors/lessphp/tests/inputs/media.less
new file mode 100644
index 000000000..0e65d942f
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/media.less
@@ -0,0 +1,38 @@
+@media screen, 3D {
+ P { color: green; }
+}
+@media print {
+ body { font-size: 10pt }
+}
+@media screen {
+ body { font-size: 13px }
+}
+@media screen, print {
+ body { line-height: 1.2 }
+}
+
+@media all and (min-width: 0px) {
+ body { line-height: 1.2 }
+}
+
+@media all and (min-width: 0) {
+ body { line-height: 1.2 }
+}
+
+@media
+ screen and (min-width: 102.5em) and (max-width: 117.9375em),
+ screen and (min-width: 150em) {
+ body { color: blue }
+}
+
+
+@media screen and (min-height: 100px + 10px) {
+ body { color: red; }
+}
+
+@cool: 100px;
+
+@media screen and (height: @cool) and (width: @cool + 10), (size: @cool + 20) {
+ body { color: red; }
+}
+
diff --git a/vendors/lessphp/tests/inputs/misc.less b/vendors/lessphp/tests/inputs/misc.less
new file mode 100644
index 000000000..86bd8f706
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/misc.less
@@ -0,0 +1,84 @@
+
+@hello: "utf-8";
+@charset @hello;
+
+@color: #fff;
+@base_path: "/assets/images/";
+@images: @base_path + "test/";
+.topbar { background: url(@{images}topbar.png); }
+.hello { test: empty-function(@images, 40%, to(@color)); }
+
+.css3 {
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 90%,
+ from(#E9A000), to(#A37000));
+}
+
+
+/**
+
+Here is a block comment
+
+**/
+
+
+// this is a comment
+
+.test, /*hello*/.world {
+ border: 1px solid red; // world
+ /* another property */
+ color: url(http://mage-page.com);
+ string: "hello /* this is not a comment */";
+ world: "// neither is this";
+ string: 'hello /* this is not a comment */' /*what if this is a comment */;
+ world: '// neither is this' // hell world;
+ ;
+ what-/*something?*/ever: 100px;
+ background: url(/*no comment here*/);
+}
+
+
+.urls {
+ @var: "http://google.com";
+ background: url(@var);
+ background: url(@{var});
+ background: url("@{var}");
+}
+
+.mix(@arg) { color: @arg; }
+@aaa: aaa;
+@bbb: bbb;
+// make sure the opening selector isn't too greedy
+.cool {.mix("@{aaa}, @{bbb}")}
+.cool();
+
+.cool("{hello");
+.cool('{hello');
+
+
+// merging of mixins
+.span-17 { float: left; }
+.span-17 { width: 660px; }
+
+.x {.span-17;}
+
+.hi {
+ pre {
+ color: red;
+ }
+}
+
+.hi {
+ pre {
+ color: blue;
+ }
+}
+
+.rad {
+ .hi;
+}
+
+
+@page :left { margin-left: 4cm; }
+@page :right { margin-left: 3cm; }
+@page { margin: 2cm }
+
diff --git a/vendors/lessphp/tests/inputs/mixin_functions.less b/vendors/lessphp/tests/inputs/mixin_functions.less
new file mode 100644
index 000000000..fc9d57901
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/mixin_functions.less
@@ -0,0 +1,40 @@
+
+@outer: 10px;
+@class(@var:22px, @car: 400px + @outer) {
+ margin: @var;
+ height: @car;
+}
+
+@group {
+ @f(@color) {
+ color: @color;
+ }
+ .cool {
+ border-bottom: 1px solid green;
+ }
+}
+
+.class(@width:200px) {
+ padding: @width;
+}
+
+body {
+ .class(2.0em);
+ @group > @f(red);
+ @class(10px, 10px + 2);
+ @group > .cool;
+}
+
+
+@lots(@a: 10px, @b: 20px, @c: 30px, @d: 40px, @e: 4px, @f:3px, @g:2px, @h: 1px) {
+ padding: @a @b @c @d;
+ margin: @e @f @g @h;
+}
+
+.skip_args {
+ @class(,12px);
+ @lots(,,,88px,,12px);
+ @group > @f(red,,,,);
+ @group > @f(red);
+}
+
diff --git a/vendors/lessphp/tests/inputs/mixin_merging.less.disable b/vendors/lessphp/tests/inputs/mixin_merging.less.disable
new file mode 100644
index 000000000..6b25e421f
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/mixin_merging.less.disable
@@ -0,0 +1,100 @@
+
+@tester {
+ p, div { height: 10px; }
+}
+
+#test1 {
+ div { color: red; }
+ @tester;
+}
+
+
+@cool {
+ a,b,i { width: 1px; }
+}
+
+#test2 {
+ b { color: red; }
+ @cool;
+}
+
+#test3 {
+ @cool;
+ b { color: red; }
+}
+
+@cooler {
+ a { margin: 1px; }
+}
+
+#test4 {
+ a, div, html { color: blue; }
+ @cooler;
+}
+
+@hi {
+ img, strong { float: right; }
+}
+
+#test5 {
+ img, strong { padding: 2px; }
+ @hi;
+}
+
+@nested {
+ div, span {
+ a {
+ color: red;
+ }
+ }
+}
+
+#test6 {
+ div, span {
+ a {
+ line-height: 10px;
+ }
+ }
+ @nested;
+}
+
+@broken-nesting {
+ div, span {
+ strong, b {
+ color: red;
+ }
+ }
+
+}
+
+#test7 {
+ div {
+ strong {
+ margin: 1px;
+ }
+ }
+ @broken-nesting;
+}
+
+
+@another-nest {
+ a,b {
+ i {
+ color: red;
+ }
+
+ s {
+ color: blue;
+ }
+ }
+}
+
+#test8 {
+ a, b {
+ i,s {
+ background: red;
+ }
+ }
+ @another-nest;
+}
+
diff --git a/vendors/lessphp/tests/inputs/mixins.less b/vendors/lessphp/tests/inputs/mixins.less
new file mode 100644
index 000000000..259db3def
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/mixins.less
@@ -0,0 +1,126 @@
+
+@rounded-corners {
+ border-radius: 10px;
+}
+
+.bold {
+ @font-size: 20px;
+ font-size: @font-size;
+ font-weight: bold;
+}
+
+body #window {
+ @rounded-corners;
+ .bold;
+ line-height: @font-size * 1.5;
+}
+
+#bundle {
+ .button {
+ display: block;
+ border: 1px solid black;
+ background-color: grey;
+ &:hover { background-color: white }
+ }
+}
+#header a {
+ color: orange;
+ #bundle > .button; // mixin the button class
+}
+
+div {
+ @abstract {
+ hello: world;
+ b {
+ color: blue;
+ }
+ }
+
+ @abstract > b;
+ @abstract;
+}
+
+@poop {
+ big: baby;
+}
+
+body {
+ div;
+}
+
+// not using > to list mixins
+
+.hello {
+ .world {
+ color: blue;
+ }
+}
+
+.foobar {
+ .hello .world;
+}
+
+
+.butter {
+ .this .one .isnt .found;
+}
+
+
+// arguments
+
+.spam(@something: 100, @dad: land) {
+ @wow: 23434;
+ foo: @arguments;
+ bar: @arguments;
+}
+
+.eggs {
+ .spam(1px, 2px);
+ .spam();
+}
+
+.first(@one, @two, @three, @four: cool) {
+ cool: @arguments;
+}
+
+#hello {
+ .first(one, two, three);
+}
+
+#hello-important {
+ .first(one, two, three) !important;
+}
+
+.rad(@name) {
+ cool: @arguments;
+}
+
+#world {
+ @hello: "world";
+ .rad("@{hello}");
+}
+
+.second(@x, @y:skip, @z: me) {
+ things: @arguments;
+}
+
+#another {
+ .second(red, blue, green);
+ .second(red blue green);
+}
+
+
+.another(@x, @y:skip, @z:me) {
+ .cool {
+ color: @arguments;
+ }
+}
+
+#day {
+ .another(one,two, three);
+ .another(one two three);
+}
+
+
+
+
diff --git a/vendors/lessphp/tests/inputs/nested.less b/vendors/lessphp/tests/inputs/nested.less
new file mode 100644
index 000000000..0b62ea19b
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/nested.less
@@ -0,0 +1,60 @@
+#header {
+ color: black;
+
+ .navigation {
+ font-size: 12px;
+ .border {
+ .outside {
+ color: blue;
+ }
+ }
+ }
+ .logo {
+ width: 300px;
+ &:hover { text-decoration: none }
+ }
+}
+
+a { b { ul { li { color: green; } } } }
+
+this { will { not { show { } } } }
+
+.cool {
+ div & { color: green; }
+ p & span { color: yellow; }
+}
+
+another {
+ .cool;
+}
+
+b {
+ & .something {
+ color: blue;
+ }
+
+ &.something {
+ color: blue;
+ }
+}
+
+.foo {
+ .bar, .baz {
+ & .qux {
+ display: block;
+ }
+ .qux & {
+ display: inline;
+ }
+ .qux & .biz {
+ display: none;
+ }
+ }
+}
+
+b {
+ hello [x="&yeah"] {
+ color: red;
+ }
+}
+
diff --git a/vendors/lessphp/tests/inputs/pattern_matching.less b/vendors/lessphp/tests/inputs/pattern_matching.less
new file mode 100644
index 000000000..e875473d3
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/pattern_matching.less
@@ -0,0 +1,167 @@
+
+.demo (light, @color) {
+ color: lighten(@color, 10%);
+}
+.demo (@_, @color) {
+ display: block;
+}
+
+@switch: light;
+
+.class {
+ .demo(@switch, #888);
+}
+
+// by arity
+
+.mixin () {
+ zero: 0;
+}
+.mixin (@a: 1px) {
+ one: 1;
+}
+.mixin (@a) {
+ one-req: 1;
+}
+.mixin (@a: 1px, @b: 2px) {
+ two: 2;
+}
+
+.mixin (@a, @b, @c) {
+ three-req: 3;
+}
+
+.mixin (@a: 1px, @b: 2px, @c: 3px) {
+ three: 3;
+}
+
+.zero {
+ .mixin();
+}
+
+.one {
+ .mixin(1);
+}
+
+.two {
+ .mixin(1, 2);
+}
+
+.three {
+ .mixin(1, 2, 3);
+}
+
+//
+
+.mixout ('left') {
+ left: 1;
+}
+
+.mixout ('right') {
+ right: 1;
+}
+
+.left {
+ .mixout('left');
+}
+.right {
+ .mixout('right');
+}
+
+//
+
+.border (@side, @width) {
+ color: black;
+ .border-side(@side, @width);
+}
+.border-side (left, @w) {
+ border-left: @w;
+}
+.border-side (right, @w) {
+ border-right: @w;
+}
+
+.border-right {
+ .border(right, 4px);
+}
+.border-left {
+ .border(left, 4px);
+}
+
+//
+
+
+.border-radius (@r) {
+ both: @r * 10;
+}
+.border-radius (@r, left) {
+ left: @r;
+}
+.border-radius (@r, right) {
+ right: @r;
+}
+
+.only-right {
+ .border-radius(33, right);
+}
+.only-left {
+ .border-radius(33, left);
+}
+.left-right {
+ .border-radius(33);
+}
+
+.hola(hello, @hello...) {
+ color: blue;
+}
+
+#hola {
+ .hola(hello, world);
+ .hola(jello, world);
+}
+
+.resty(@hello, @world, @the_rest...) {
+ padding: @hello @world;
+ rest: @the_rest;
+}
+
+#nnn {
+ .body(10, 10, 10, 10, 10);
+ .body(10, 10, 10);
+ .body(10, 10);
+ .body(10);
+ .body();
+}
+
+.defaults(@aa, @bb:e343, @cc: "heah", ...) {
+ height: @aa;
+}
+
+#defaults_1 {
+ .defaults();
+ .defaults(one);
+ .defaults(two, one);
+ .defaults(three, two, one);
+ .defaults(four, three, two, one);
+}
+
+
+.thing() { color: green; }
+.thing(...) { color: blue; }
+.thing { color: red; }
+
+#aa {
+ .thing();
+}
+
+#bb {
+ .thing;
+}
+
+
+#cc {
+ .thing(1);
+}
+
+
+
diff --git a/vendors/lessphp/tests/inputs/scopes.less b/vendors/lessphp/tests/inputs/scopes.less
new file mode 100644
index 000000000..0ddbfac20
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/scopes.less
@@ -0,0 +1,40 @@
+
+
+@a: 10;
+@some {
+ @b: @a + 10;
+ div {
+ @c: @b + 10;
+ other {
+ @d: @c + 10;
+ world {
+ @e: @d + 10;
+ height: @e;
+ }
+ }
+ }
+}
+
+
+body {
+ @some;
+}
+
+@some;
+
+.test(@x: 10) {
+ height: @x;
+ .test(@y: 11) {
+ height: @y;
+ .test(@z: 12) {
+ height: @z;
+ }
+ .test;
+ }
+ .test;
+}
+
+pre {
+ .test;
+}
+
diff --git a/vendors/lessphp/tests/inputs/selector_expressions.less b/vendors/lessphp/tests/inputs/selector_expressions.less
new file mode 100644
index 000000000..a16c1d23a
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/selector_expressions.less
@@ -0,0 +1,29 @@
+
+@color: blue;
+
+(~"something @{color}"), world {
+ color: blue;
+}
+
+.div {
+ @color: red;
+ (3434) {
+ height: 100px;
+ }
+
+ (~"cool @{color}") {
+ height: 4000px;
+ }
+}
+
+.heck(@a) { color: @a+10 }
+
+.spanX (@index) when (@index > 0) {
+ (~".span@{index}") { .heck(@index) }
+ .spanX(@index - 1);
+}
+.spanX (0) {}
+
+.spanX (5);
+
+
diff --git a/vendors/lessphp/tests/inputs/site_demos.less b/vendors/lessphp/tests/inputs/site_demos.less
new file mode 100644
index 000000000..136a99ac8
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/site_demos.less
@@ -0,0 +1,120 @@
+// these are the demos from the lessphp homepage
+
+default {
+ @base: 24px;
+ @border-color: #B2B;
+
+ .underline { border-bottom: 1px solid green }
+
+ #header {
+ color: black;
+ border: 1px solid @border-color + #222222;
+
+ .navigation {
+ font-size: @base / 2;
+ a {
+ .underline;
+ }
+ }
+ .logo {
+ width: 300px;
+ &:hover { text-decoration: none }
+ }
+ }
+}
+
+variables {
+ @a: 2;
+ @x: @a * @a;
+ @y: @x + 1;
+ @z: @x * 2 + @y;
+
+ @nice-blue: #5B83AD;
+ @light-blue: @nice-blue + #111;
+
+ @b: @a * 10;
+ @c: #888;
+ @fonts: "Trebuchet MS", Verdana, sans-serif;
+
+ .variables {
+ width: @z + 1cm; // 14cm
+ height: @b + @x + 0px; // 24px
+ color: @c;
+ background: @light-blue;
+ font-family: @fonts;
+ }
+}
+
+mixins {
+ .bordered {
+ border-top: dotted 1px black;
+ border-bottom: solid 2px black;
+ }
+ #menu a {
+ color: #111;
+ .bordered;
+ }
+
+ .post a {
+ color: red;
+ .bordered;
+ }
+}
+
+nested-rules {
+ #header {
+ color: black;
+
+ .navigation {
+ font-size: 12px;
+ }
+ .logo {
+ width: 300px;
+ &:hover { text-decoration: none }
+ }
+ }
+}
+
+namespaces {
+ #bundle {
+ .button {
+ display: block;
+ border: 1px solid black;
+ background-color: grey;
+ &:hover { background-color: white }
+ }
+ }
+ #header a {
+ color: orange;
+ #bundle > .button; // mixin the button class
+ }
+}
+
+mixin-functions {
+ @outer: 10px;
+ @class(@var:22px, @car: 400px + @outer) {
+ margin: @var;
+ height: @car;
+ }
+
+ @group {
+ @f(@color) {
+ color: @color;
+ }
+ .cool {
+ border-bottom: 1px solid green;
+ }
+ }
+
+ .class(@width:200px) {
+ padding: @width;
+ }
+
+ body {
+ .class(2.0em);
+ @group > @f(red);
+ @class(10px, 10px + 2);
+ @group > .cool;
+ }
+}
+
diff --git a/vendors/lessphp/tests/inputs/test-imports/file1.less b/vendors/lessphp/tests/inputs/test-imports/file1.less
new file mode 100644
index 000000000..658de0c53
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/test-imports/file1.less
@@ -0,0 +1,16 @@
+
+
+/**
+ * This is a test import file
+ */
+
+@colors {
+ div.bright {
+ color: red;
+ }
+
+ div.sad {
+ color: blue;
+ }
+}
+
diff --git a/vendors/lessphp/tests/inputs/test-imports/file2.less b/vendors/lessphp/tests/inputs/test-imports/file2.less
new file mode 100644
index 000000000..2cae8dce0
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/test-imports/file2.less
@@ -0,0 +1,6 @@
+
+b {
+ color: @color;
+ padding: 16px;
+}
+
diff --git a/vendors/lessphp/tests/inputs/variables.less b/vendors/lessphp/tests/inputs/variables.less
new file mode 100644
index 000000000..6c4ef8fb4
--- /dev/null
+++ b/vendors/lessphp/tests/inputs/variables.less
@@ -0,0 +1,45 @@
+@a: 2;
+@x: @a * @a;
+@y: @x + 1;
+@z: @y + @x * 2;
+@m: @z % @y;
+
+@nice-blue: #5B83AD;
+@light-blue: @nice-blue + #111;
+
+@rgb-color: rgb(20%, 15%, 80%);
+@rgba-color: rgba(23,68,149,0.5);
+
+@b: @a * 10px;
+@c: #888;
+@fonts: "Trebuchet MS", Verdana, sans-serif;
+
+.variables {
+ width: @z + 1cm; // 14cm
+ height: @b + @x + 0px; // 24px
+ margin-top: -@b; // -20px
+ margin-bottom: 10 - -@b; // 30px
+ @d: @c + #001;
+ color: @d;
+ background: @light-blue;
+ font-family: @fonts;
+ margin: @m + 0px; // 3px
+ font: 10px/12px serif;
+ font: 120%/120% serif;
+}
+
+.external {
+ color: @c;
+ border: 1px solid @rgb-color;
+ background: @rgba-color;
+ padding: @nonexistant + 4px;
+}
+
+@hello: 44px;
+@something: "hello";
+@cool: something;
+
+color: @@something;
+color: @@@cool;
+
+
diff --git a/vendors/lessphp/tests/outputs/accessors.css b/vendors/lessphp/tests/outputs/accessors.css
new file mode 100644
index 000000000..e6c01a72c
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/accessors.css
@@ -0,0 +1,14 @@
+.article { color:#294366; }
+.comment {
+ width:960px;
+ color:#294366;
+ padding:10px;
+}
+.wow {
+ height:960px;
+ background-color:#294366;
+ color:green;
+ padding:;
+ margin:;
+}
+.mix { font-size:10px; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/arity.css b/vendors/lessphp/tests/outputs/arity.css
new file mode 100644
index 000000000..7900e4087
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/arity.css
@@ -0,0 +1,25 @@
+.one {
+ color:one;
+ color:one;
+}
+.two {
+ color:two;
+ color:two;
+}
+.three {
+ color:three;
+ color:three;
+}
+.multi-foo {
+ color:two;
+ color:three;
+ color:two;
+ color:three;
+ color:three;
+}
+.multi-baz {
+ color:two;
+ color:three;
+ color:two;
+ color:three;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/attributes.css b/vendors/lessphp/tests/outputs/attributes.css
new file mode 100644
index 000000000..229f7cf36
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/attributes.css
@@ -0,0 +1,35 @@
+* { color:blue; }
+E { color:blue; }
+E[foo] { color:blue; }
+[foo] { color:blue; }
+[foo] .helloWorld { color:blue; }
+[foo].helloWorld { color:blue; }
+E[foo="barbar"] { color:blue; }
+E[foo~="hello#$@%@$#^"] { color:blue; }
+E[foo^="color: green;"] { color:blue; }
+E[foo$="239023"] { color:blue; }
+E[foo*="29302"] { color:blue; }
+E[foo|="239032"] { color:blue; }
+E:root { color:blue; }
+E:nth-child(odd) { color:blue; }
+E:nth-child(2n+1) { color:blue; }
+E:nth-child(5) { color:blue; }
+E:nth-last-child(-n+2) { color:blue; }
+E:nth-of-type(2n) { color:blue; }
+E:nth-last-of-type(n) { color:blue; }
+E:first-child { color:blue; }
+E:last-child { color:blue; }
+E:first-of-type { color:blue; }
+E:last-of-type { color:blue; }
+E:only-child { color:blue; }
+E:only-of-type { color:blue; }
+E:empty { color:blue; }
+E:lang(en) { color:blue; }
+E::first-line { color:blue; }
+E::before { color:blue; }
+E#id { color:blue; }
+E:not(:link) { color:blue; }
+E F { color:blue; }
+E > F { color:blue; }
+E + F { color:blue; }
+E ~ F { color:blue; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/builtins.css b/vendors/lessphp/tests/outputs/builtins.css
new file mode 100644
index 000000000..1787e0ba3
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/builtins.css
@@ -0,0 +1,20 @@
+body {
+ color:"hello world";
+ height:5.1666666666667;
+ height:5px;
+ height:6px;
+ width:0.66666666666667;
+ width:1;
+ width:0;
+ width:1;
+ width:3px;
+ color:#00112233;
+ color:#992c3742;
+}
+format {
+ format:"rgb(32, 128, 64)";
+ format-string:"hello world";
+ format-multiple:"hello earth 2";
+ format-url-encode:'red is %A';
+ eformat:rgb(32, 128, 64);
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/colors.css b/vendors/lessphp/tests/outputs/colors.css
new file mode 100644
index 000000000..51eb152b5
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/colors.css
@@ -0,0 +1,69 @@
+body {
+ color:#996d33;
+ color:rgba(153,109,51,0.3);
+ lighten:#fff;
+ lighten:#7c8df2;
+ lighten:rgba(222,140,129,0.5);
+ darken:#d6d6d6;
+ darken:#0d1e81;
+ darken:rgba(18,42,185,0.5);
+ saturate:#f1eded;
+ saturate:#0025fe;
+ saturate:rgba(10,44,244,0.5);
+ desaturate:#efefef;
+ desaturate:#3349cb;
+ desaturate:rgba(36,62,218,0.5);
+ spin:#efefef;
+ spin:#2d17e7;
+ spin:rgba(59,23,231,0.5);
+ spin:#efefef;
+ spin:#1769e7;
+ spin:rgba(23,119,231,0.5);
+ one:#abcdef;
+ one:#abcdef;
+ two:rgba(2,159,35,0.9);
+ two:rgba(2,159,35,0.9);
+ three:rgba(1,2,3,0.6);
+ three:rgba(1,2,3,0.6);
+ four:rgba(1,2,3,0);
+ four:rgba(1,2,3,0);
+ hue:282;
+ sat:33;
+ lit:12;
+ what:#dff1da;
+ zero:#343434;
+ zero:#003468;
+ zero:#000;
+ zero:#fff;
+ zero:#000;
+ zero:#fff;
+ zero:#fff;
+ zero:#fff;
+ zero:#1d5612;
+ zero:#56124b;
+ zero:#000;
+ zero:#fff;
+}
+alpha {
+ g:0;
+ g:1;
+}
+fade {
+ f:rgba(255,0,0,0.5);
+ f:rgba(255,255,255,0.2);
+ f:rgba(34,23,64,0.5);
+}
+.mix { color:#808080; }
+.percent { per:50%; }
+.colorz {
+ color:#ebebeb;
+ color:#ff9100;
+}
+body {
+ start:#fcf8e3;
+ spin:#fcf4e3;
+ chained:#fbeed5;
+ direct:#fbefd5;
+}
+pre { spin:#f2dee1; }
+dd { background-color:#f5f5f5; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/compile_on_mixin.css b/vendors/lessphp/tests/outputs/compile_on_mixin.css
new file mode 100644
index 000000000..b1a3d7fcc
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/compile_on_mixin.css
@@ -0,0 +1,11 @@
+body { height:22px; }
+body ul { height:20px; }
+body ul li { height:10px; }
+body ul li div span, body ul li link {
+ margin:10px;
+ color:red;
+}
+body ul div, body ul p { border:1px; }
+body ul div.hello, body ul p.hello { color:green; }
+body ul div :what, body ul p :what { color:blue; }
+body ul a b { color:blue; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/escape.css b/vendors/lessphp/tests/outputs/escape.css
new file mode 100644
index 000000000..a310fe009
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/escape.css
@@ -0,0 +1,14 @@
+body {
+ border:this is simple;
+ border:this;
+ border:this is simple;
+ border:1232;
+ border:world;
+ border:onemore;
+ border:;
+ line-height:eating rice;
+ line-height:string cheese;
+ line-height:a b c string me d e f;
+ line-height:string world;
+}
+.class { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png'); } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/font_family.css b/vendors/lessphp/tests/outputs/font_family.css
new file mode 100644
index 000000000..afbc996d3
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/font_family.css
@@ -0,0 +1,17 @@
+@font-face {
+ font-family:Graublau Sans Web;
+ src:url(fonts/GraublauWeb.otf) format("opentype");
+}
+@font-face {
+ font-family:Gentium;
+ src:url('fonts/Gentium.ttf');
+}
+@font-face {
+ font-family:Gentium;
+ src:url("fonts/GentiumItalic.ttf");
+ font-style:italic;
+}
+h2 {
+ font-family:Gentium;
+ crazy:maroon;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/guards.css b/vendors/lessphp/tests/outputs/guards.css
new file mode 100644
index 000000000..db110aa9d
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/guards.css
@@ -0,0 +1,23 @@
+dd { color:yellow; }
+b {
+ color:red;
+ color:blue;
+ color:blue;
+}
+img {
+ color:green;
+ color:teal;
+}
+body {
+ color:purple;
+ color:silver;
+ color:purple;
+}
+div { color:blue; }
+link {
+ color:true red;
+ color:true #fff;
+ color:true #fffddd;
+ color:true #000;
+ color:true rgba(0,0,0,0.34);
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/hacks.css b/vendors/lessphp/tests/outputs/hacks.css
new file mode 100644
index 000000000..984faa6e5
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/hacks.css
@@ -0,0 +1 @@
+:root .alert-message, :root .btn { border-radius:0 \0; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/import.css b/vendors/lessphp/tests/outputs/import.css
new file mode 100644
index 000000000..4d50ba598
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/import.css
@@ -0,0 +1,14 @@
+@import url("something.css") media;
+@import url("something.css") media;
+@import url("something.css") media, screen, print;
+b {
+ color:maroon;
+ padding:16px;
+}
+body { line-height:10em; }
+body div.bright { color:red; }
+body div.sad { color:blue; }
+div b {
+ color:fuchsia;
+ padding:16px;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/keyframes.css b/vendors/lessphp/tests/outputs/keyframes.css
new file mode 100644
index 000000000..d01f05b77
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/keyframes.css
@@ -0,0 +1,47 @@
+@keyframes 'bounce' {
+ from {
+ top:100px;
+ animation-timing-function:ease-out;
+ }
+ 25% {
+ top:50px;
+ animation-timing-function:ease-in;
+ }
+ 50% {
+ top:100px;
+ animation-timing-function:ease-out;
+ }
+ 75% {
+ top:75px;
+ animation-timing-function:ease-in;
+ }
+ to {
+ top:100px;
+ }
+}
+@-webkit-keyframes flowouttoleft {
+ 0% {
+ -webkit-transform:translateX(0) scale(1);
+ }
+ 60%, 70% {
+ -webkit-transform:translateX(0) scale(.7);
+ }
+ 100% {
+ -webkit-transform:translateX(-100%) scale(.7);
+ }
+}
+div {
+ animation-name:'diagonal-slide';
+ animation-duration:5s;
+ animation-iteration-count:10;
+}
+@keyframes 'diagonal-slide' {
+ from {
+ left:0;
+ top:0;
+ }
+ to {
+ left:100px;
+ top:100px;
+ }
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/math.css b/vendors/lessphp/tests/outputs/math.css
new file mode 100644
index 000000000..bcd66839e
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/math.css
@@ -0,0 +1,61 @@
+.unary { sub:10 -5; }
+.spaces {
+ sub:5;
+ sub:5;
+ add:15;
+ add:15;
+ div:2;
+ mul:50;
+ mul:50;
+}
+.supress-division {
+ border-radius:10px/10px;
+ border-radius:10px/10px;
+ border-radius:hello(10px/10px) world;
+ font:10px/30 sans-serif;
+ font:10px/20px sans-serif;
+ font:10px/20px sans-serif;
+ border-radius:0 15px 15px 15px/0 50% 50% 50%;
+}
+.parens {
+ sub:5;
+ add:15;
+ div:2;
+ div:2;
+ mul:50;
+}
+.keyword-names { height:"hello" 25; }
+.negation {
+ hello:-1px;
+ hello:-1px;
+ hello:-10;
+}
+.test {
+ single:5;
+ single:10;
+ single:10;
+ parens:10 -2;
+ math:20;
+ math:20;
+ width:71;
+ height:6;
+ padding:6px 1em 2px 2;
+ padding:8 4 4 4px;
+ width:96;
+ height:113;
+ margin:12;
+}
+.percents {
+ color:1000%;
+ color:1000%;
+ color:100%;
+ color:1000px;
+ color:1000%;
+ color:30%;
+ color:10%;
+ color:2%;
+}
+.misc {
+ x:40px;
+ y:40em;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/media.css b/vendors/lessphp/tests/outputs/media.css
new file mode 100644
index 000000000..cb5683fd4
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/media.css
@@ -0,0 +1,28 @@
+@media screen, 3D {
+ P { color:green; }
+}
+@media print {
+ body { font-size:10pt; }
+}
+@media screen {
+ body { font-size:13px; }
+}
+@media screen, print {
+ body { line-height:1.2; }
+}
+@media all and (min-width: 0px) {
+ body { line-height:1.2; }
+}
+@media all and (min-width: 0) {
+ body { line-height:1.2; }
+}
+@media screen and (min-width: 102.5em) and (max-width: 117.9375em),
+ screen and (min-width: 150em) {
+ body { color:blue; }
+}
+@media screen and (min-height: 110px) {
+ body { color:red; }
+}
+@media screen and (height: 100px) and (width: 110px), (size: 120px) {
+ body { color:red; }
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/misc.css b/vendors/lessphp/tests/outputs/misc.css
new file mode 100644
index 000000000..8d85268c8
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/misc.css
@@ -0,0 +1,40 @@
+@charset "utf-8";
+color:"aaa, bbb";
+.topbar { background:url(/assets/images/test/topbar.png); }
+.hello { test:empty-function("/assets/images/test/",40%,to(#fff)); }
+.css3 { background-image:-webkit-gradient(linear,0% 0%,0% 90%,from(#e9a000),to(#a37000)); }
+.test, .world {
+ border:1px solid red;
+ color:url(http://mage-page.com);
+ string:"hello /* this is not a comment */";
+ world:"// neither is this";
+ string:'hello /* this is not a comment */';
+ world:'// neither is this';
+ what-ever:100px;
+ background:url(/*no comment here*/);
+}
+.urls {
+ background:url("http://google.com");
+ background:url(http://google.com);
+ background:url("http://google.com");
+}
+.cool { color:"aaa, bbb"; }
+.span-17 { float:left; }
+.span-17 { width:660px; }
+.x {
+ float:left;
+ width:660px;
+}
+.hi pre { color:red; }
+.hi pre { color:blue; }
+.rad pre { color:red; }
+.rad pre { color:blue; }
+@page :left {
+ margin-left:4cm;
+}
+@page :right {
+ margin-left:3cm;
+}
+@page {
+ margin:2cm;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/mixin_functions.css b/vendors/lessphp/tests/outputs/mixin_functions.css
new file mode 100644
index 000000000..91b61492e
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/mixin_functions.css
@@ -0,0 +1,14 @@
+body {
+ padding:2.0em;
+ color:red;
+ margin:10px;
+ height:12px;
+ border-bottom:1px solid green;
+}
+.skip_args {
+ margin:22px;
+ height:12px;
+ padding:10px 20px 30px 88px;
+ margin:4px 12px 2px 1px;
+ color:red;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/mixin_merging.css b/vendors/lessphp/tests/outputs/mixin_merging.css
new file mode 100644
index 000000000..9ec360c21
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/mixin_merging.css
@@ -0,0 +1,42 @@
+#test1 div {
+ color:red;
+ height:10px;
+}
+#test1 p { height:10px; }
+#test2 b {
+ color:red;
+ width:1px;
+}
+#test2 a, #test2 i { width:1px; }
+#test3 a, #test3 i { width:1px; }
+#test3 b {
+ width:1px;
+ color:red;
+}
+#test4 a {
+ color:blue;
+ margin:1px;
+}
+#test4 div, #test4 html { color:blue; }
+#test5 img, #test5 strong {
+ padding:2px;
+ float:right;
+}
+#test6 div a, #test6 span a {
+ line-height:10px;
+ color:red;
+}
+#test7 div strong {
+ margin:1px;
+ color:red;
+}
+#test7 div b { color:red; }
+#test7 span strong, #test7 span b { color:red; }
+#test8 a i, #test8 b i {
+ background:red;
+ color:red;
+}
+#test8 a s, #test8 b s {
+ background:red;
+ color:blue;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/mixins.css b/vendors/lessphp/tests/outputs/mixins.css
new file mode 100644
index 000000000..70a99003d
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/mixins.css
@@ -0,0 +1,50 @@
+.bold {
+ font-size:20px;
+ font-weight:bold;
+}
+body #window {
+ line-height:0;
+ border-radius:10px;
+ font-size:20px;
+ font-weight:bold;
+}
+#bundle .button {
+ display:block;
+ border:1px solid black;
+ background-color:grey;
+}
+#bundle .button:hover { background-color:white; }
+#header a {
+ color:orange;
+ display:block;
+ border:1px solid black;
+ background-color:grey;
+}
+#header a:hover { background-color:white; }
+div {
+ color:blue;
+ hello:world;
+}
+div b { color:blue; }
+body {
+ color:blue;
+ hello:world;
+}
+body b { color:blue; }
+.hello .world { color:blue; }
+.foobar { color:blue; }
+.eggs {
+ foo:1px 2px;
+ bar:1px 2px;
+ foo:100 land;
+ bar:100 land;
+}
+#hello { cool:one two three cool; }
+#hello-important { cool:one two three cool !important; }
+#world { cool:"world"; }
+#another {
+ things:red blue green;
+ things:red blue green skip me;
+}
+#day .cool { color:one two three; }
+#day .cool { color:one two three skip me; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/nested.css b/vendors/lessphp/tests/outputs/nested.css
new file mode 100644
index 000000000..0845fb6ff
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/nested.css
@@ -0,0 +1,16 @@
+#header { color:black; }
+#header .navigation { font-size:12px; }
+#header .navigation .border .outside { color:blue; }
+#header .logo { width:300px; }
+#header .logo:hover { text-decoration:none; }
+a b ul li { color:green; }
+div .cool { color:green; }
+p .cool span { color:yellow; }
+div another { color:green; }
+p another span { color:yellow; }
+b .something { color:blue; }
+b.something { color:blue; }
+.foo .bar .qux, .foo .baz .qux { display:block; }
+.qux .foo .bar, .qux .foo .baz { display:inline; }
+.qux .foo .bar .biz, .qux .foo .baz .biz { display:none; }
+b hello [x="&yeah"] { color:red; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/nesting.css b/vendors/lessphp/tests/outputs/nesting.css
new file mode 100644
index 000000000..908c1d814
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/nesting.css
@@ -0,0 +1,6 @@
+#header .navigation .border .outside { color:blue; }
+#header .navigation { font-size:12px; }
+#header .logo:hover { text-decoration:none; }
+#header .logo { width:300px; }
+#header { color:black; }
+a b ul li { color:green; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/pattern_matching.css b/vendors/lessphp/tests/outputs/pattern_matching.css
new file mode 100644
index 000000000..f83ace15f
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/pattern_matching.css
@@ -0,0 +1,56 @@
+.class {
+ color:#a2a2a2;
+ display:block;
+}
+.zero {
+ zero:0;
+ one:1;
+ two:2;
+ three:3;
+}
+.one {
+ one:1;
+ one-req:1;
+ two:2;
+ three:3;
+}
+.two {
+ two:2;
+ three:3;
+}
+.three {
+ three-req:3;
+ three:3;
+}
+.left { left:1; }
+.right { right:1; }
+.border-right {
+ color:black;
+ border-right:4px;
+}
+.border-left {
+ color:black;
+ border-left:4px;
+}
+.only-right { right:33; }
+.only-left { left:33; }
+.left-right { both:330; }
+#hola { color:blue; }
+#defaults_1 {
+ height:one;
+ height:two;
+ height:three;
+ height:four;
+}
+.thing { color:red; }
+#aa {
+ color:green;
+ color:blue;
+ color:red;
+}
+#bb {
+ color:green;
+ color:blue;
+ color:red;
+}
+#cc { color:blue; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/scopes.css b/vendors/lessphp/tests/outputs/scopes.css
new file mode 100644
index 000000000..23d1551ca
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/scopes.css
@@ -0,0 +1,7 @@
+body div other world { height:50; }
+div other world { height:50; }
+pre {
+ height:10;
+ height:11;
+ height:12;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/selector_expressions.css b/vendors/lessphp/tests/outputs/selector_expressions.css
new file mode 100644
index 000000000..78dc4bb92
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/selector_expressions.css
@@ -0,0 +1,8 @@
+something blue, world { color:blue; }
+.div 3434 { height:100px; }
+.div cool red { height:4000px; }
+.span5 { color:15; }
+.span4 { color:14; }
+.span3 { color:13; }
+.span2 { color:12; }
+.span1 { color:11; } \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/site_demos.css b/vendors/lessphp/tests/outputs/site_demos.css
new file mode 100644
index 000000000..2c853af4c
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/site_demos.css
@@ -0,0 +1,54 @@
+default .underline { border-bottom:1px solid green; }
+default #header {
+ color:black;
+ border:1px solid #d4d;
+}
+default #header .navigation { font-size:12px; }
+default #header .navigation a { border-bottom:1px solid green; }
+default #header .logo { width:300px; }
+default #header .logo:hover { text-decoration:none; }
+variables .variables {
+ width:14cm;
+ height:24px;
+ color:#888;
+ background:#6c94be;
+ font-family:"Trebuchet MS", Verdana, sans-serif;
+}
+mixins .bordered {
+ border-top:dotted 1px black;
+ border-bottom:solid 2px black;
+}
+mixins #menu a {
+ color:#111;
+ border-top:dotted 1px black;
+ border-bottom:solid 2px black;
+}
+mixins .post a {
+ color:red;
+ border-top:dotted 1px black;
+ border-bottom:solid 2px black;
+}
+nested-rules #header { color:black; }
+nested-rules #header .navigation { font-size:12px; }
+nested-rules #header .logo { width:300px; }
+nested-rules #header .logo:hover { text-decoration:none; }
+namespaces #bundle .button {
+ display:block;
+ border:1px solid black;
+ background-color:grey;
+}
+namespaces #bundle .button:hover { background-color:white; }
+namespaces #header a {
+ color:orange;
+ display:block;
+ border:1px solid black;
+ background-color:grey;
+}
+namespaces #header a:hover { background-color:white; }
+mixin-functions body {
+ padding:2.0em;
+ color:red;
+ margin:10px;
+ height:12px;
+ border-bottom:1px solid green;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/outputs/variables.css b/vendors/lessphp/tests/outputs/variables.css
new file mode 100644
index 000000000..4c7e5e669
--- /dev/null
+++ b/vendors/lessphp/tests/outputs/variables.css
@@ -0,0 +1,20 @@
+color:44px;
+color:44px;
+.variables {
+ width:14cm;
+ height:24px;
+ margin-top:-20px;
+ margin-bottom:30px;
+ color:#889;
+ background:#6c94be;
+ font-family:"Trebuchet MS", Verdana, sans-serif;
+ margin:3px;
+ font:10px/12px serif;
+ font:120%/120% serif;
+}
+.external {
+ color:#888;
+ border:1px solid #3326cc;
+ background:rgba(23,68,149,0.5);
+ padding:4px;
+} \ No newline at end of file
diff --git a/vendors/lessphp/tests/sort.php b/vendors/lessphp/tests/sort.php
new file mode 100644
index 000000000..38662cb24
--- /dev/null
+++ b/vendors/lessphp/tests/sort.php
@@ -0,0 +1,57 @@
+<?php
+error_reporting(E_ALL);
+
+require realpath(dirname(__FILE__)).'/../lessc.inc.php';
+
+// sorts the selectors in stylesheet in order to normalize it for comparison
+
+$exe = array_shift($argv); // remove filename
+
+if (!$fname = array_shift($argv)) {
+ $fname = "php://stdin";
+}
+
+// also sorts the tags in the block
+function sort_key($block) {
+ if (!isset($block->sort_key)) {
+ sort($block->tags, SORT_STRING);
+ $block->sort_key = implode(",", $block->tags);
+ }
+
+ return $block->sort_key;
+}
+
+class sort_css extends lessc {
+ function __construct() {
+ parent::__construct();
+ }
+
+ // normalize numbers
+ function compileValue($value) {
+ $ignore = array('list', 'keyword', 'string', 'color', 'function');
+ if ($value[0] == 'number' || !in_array($value[0], $ignore)) {
+ $value[1] = $value[1] + 0; // convert to either double or int
+ }
+
+ return parent::compileValue($value);
+ }
+
+ function parse_and_sort($str) {
+ $root = $this->parseTree($str);
+
+ $less = $this;
+ usort($root->props, function($a, $b) use ($less) {
+
+ $sort = strcmp(sort_key($a[1]), sort_key($b[1]));
+ if ($sort == 0)
+ return strcmp($less->compileBlock($a[1]), $less->compileBlock($b[1]));
+ return $sort;
+ });
+
+ return $this->compileBlock($root);
+ }
+}
+
+$sorter = new sort_css;
+echo $sorter->parse_and_sort(file_get_contents($fname));
+
diff --git a/vendors/lessphp/tests/test.php b/vendors/lessphp/tests/test.php
new file mode 100644
index 000000000..629fe0153
--- /dev/null
+++ b/vendors/lessphp/tests/test.php
@@ -0,0 +1,190 @@
+#!/usr/bin/env php
+<?php
+error_reporting(E_ALL);
+
+/**
+ * Go through all files matching pattern in input directory
+ * and compile them, then compare them to paired file in
+ * output directory.
+ */
+$difftool = 'diff -b -B -t -u';
+$input = array(
+ 'dir' => 'inputs',
+ 'glob' => '*.less',
+);
+
+$output = array(
+ 'dir' => 'outputs',
+ 'filename' => '%s.css',
+);
+
+
+$prefix = strtr(realpath(dirname(__FILE__)), '\\', '/');
+require $prefix.'/../lessc.inc.php';
+
+$compiler = new lessc();
+$compiler->importDir = array($input['dir'].'/test-imports');
+
+$fa = 'Fatal Error: ';
+if (php_sapi_name() != 'cli') {
+ exit($fa.$argv[0].' must be run in the command line.');
+}
+
+$opts = getopt('hCd::g');
+
+if ($opts === false || isset($opts['h'])) {
+ echo <<<EOT
+Usage: ./test.php [options] [searchstring]
+
+where [options] can be a mix of these:
+
+ -h Show this help message and exit.
+
+ -d=[difftool] Show the diff of the actual output vs. the reference when a
+ test fails; uses 'diff -b -B -t -u' by default.
+
+ The test is aborted after the first failure report, unless
+ you also specify the '-g' option ('go on').
+
+ -g Continue executing the other tests when a test fails and
+ option '-d' is active.
+
+ -C Regenerate ('compile') the reference output files from the
+ given inputs.
+
+ WARNING: ONLY USE THIS OPTION WHEN YOU HAVE ASCERTAINED
+ THAT lessphp PROCESSES ALL TESTS CORRECTLY!
+
+The optional [searchstring] is used to filter the input files: only tests
+which have filename(s) containing the specified searchstring will be
+executed. I.e. the corresponding glob pattern is '*[searchstring]*.less'.
+
+The script EXIT CODE is the number of failed tests (with a maximum of 255),
+0 on success and 1 when this help message is shown. This aids in integrating
+this script in larger (user defined) shell test scripts.
+
+
+Examples of use:
+
+- Test the full test set:
+ ./test.php
+
+- Run only the mixin tests:
+ ./test.php mixin
+
+- Use a custom diff tool to show diffs for failing tests
+ ./test.php -d=meld
+
+EOT;
+ exit(1);
+}
+
+$input['dir'] = $prefix.'/'.$input['dir'];
+$output['dir'] = $prefix.'/'.$output['dir'];
+if (!is_dir($input['dir']) || !is_dir($output['dir']))
+ exit($fa." both input and output directories must exist\n");
+
+$exe = array_shift($argv); // remove filename
+// get the first non flag as search string
+$searchString = null;
+foreach ($argv as $a) {
+ if (strlen($a) > 0 && $a{0} != '-') {
+ $searchString = $a;
+ break;
+ }
+}
+
+$tests = array();
+$matches = glob($input['dir'].'/'.(!is_null($searchString) ? '*'.$searchString : '' ).$input['glob']);
+if ($matches) {
+ foreach ($matches as $fname) {
+ extract(pathinfo($fname)); // for $filename, from php 5.2
+ $tests[] = array(
+ 'in' => $fname,
+ 'out' => $output['dir'].'/'.sprintf($output['filename'], $filename),
+ );
+ }
+}
+
+$count = count($tests);
+$compiling = isset($opts["C"]);
+$continue_when_test_fails = isset($opts["g"]);
+$showDiff = isset($opts["d"]);
+if ($showDiff && !empty($opts["d"])) {
+ $difftool = $opts["d"];
+}
+
+echo ($compiling ? "Compiling" : "Running")." $count test".($count == 1 ? '' : 's').":\n";
+
+function dump($msgs, $depth = 1, $prefix=" ") {
+ if (!is_array($msgs)) $msgs = array($msgs);
+ foreach ($msgs as $m) {
+ echo str_repeat($prefix, $depth).' - '.$m."\n";
+ }
+}
+
+$fail_prefix = " ** ";
+
+$fail_count = 0;
+$i = 1;
+foreach ($tests as $test) {
+ printf(" [Test %04d/%04d] %s -> %s\n", $i, $count, basename($test['in']), basename($test['out']));
+
+ try {
+ ob_start();
+ $parsed = trim($compiler->parse(file_get_contents($test['in'])));
+ ob_end_clean();
+ } catch (exception $e) {
+ dump(array(
+ "Failed to compile input, reason:",
+ $e->getMessage(),
+ "Aborting"
+ ), 1, $fail_prefix);
+ break;
+ }
+
+ if ($compiling) {
+ file_put_contents($test['out'], $parsed);
+ } else {
+ if (!is_file($test['out'])) {
+ dump(array(
+ "Failed to find output file: $test[out]",
+ "Maybe you forgot to compile tests?",
+ "Aborting"
+ ), 1, $fail_prefix);
+ break;
+ }
+ $expected = trim(file_get_contents($test['out']));
+
+ // don't care about CRLF vs LF change (DOS/Win vs. UNIX):
+ $expected = trim(str_replace("\r\n", "\n", $expected));
+ $parsed = trim(str_replace("\r\n", "\n", $parsed));
+
+ if ($expected != $parsed) {
+ $fail_count++;
+ if ($showDiff) {
+ dump("Failed:", 1, $fail_prefix);
+ $tmp = $test['out'].".tmp";
+ file_put_contents($tmp, $parsed);
+ system($difftool.' '.$test['out'].' '.$tmp);
+ unlink($tmp);
+
+ if (!$continue_when_test_fails) {
+ dump("Aborting");
+ break;
+ } else {
+ echo "===========================================================================\n";
+ }
+ } else {
+ dump("Failed, run with -d flag to view diff", 1, $fail_prefix);
+ }
+ } else {
+ dump("Passed");
+ }
+ }
+
+ $i++;
+}
+
+exit($fail_count > 255 ? 255 : $fail_count);
+?>