// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library var_test;

import 'package:test/test.dart';

import 'testing.dart';

compileAndValidate(String input, String generated) {
  var errors = [];
  var stylesheet = compileCss(input, errors: errors, opts: options);
  expect(stylesheet != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheet), generated);
}

compilePolyfillAndValidate(String input, String generated) {
  var errors = [];
  var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
  expect(stylesheet != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheet), generated);
}

void simpleVar() {
  final input = ''':root {
  var-color-background: red;
  var-color-foreground: blue;

  var-c: #00ff00;
  var-b: var(c);
  var-a: var(b);
}
.testIt {
  color: var(color-foreground);
  background: var(color-background);
}
''';

  final generated = ''':root {
  var-color-background: #f00;
  var-color-foreground: #00f;
  var-c: #0f0;
  var-b: var(c);
  var-a: var(b);
}
.testIt {
  color: var(color-foreground);
  background: var(color-background);
}''';

  final generatedPolyfill = ''':root {
}
.testIt {
  color: #00f;
  background: #f00;
}''';

  compileAndValidate(input, generated);
  compilePolyfillAndValidate(input, generatedPolyfill);
}

void expressionsVar() {
  final input = ''':root {
  var-color-background: red;
  var-color-foreground: blue;

  var-c: #00ff00;
  var-b: var(c);
  var-a: var(b);

  var-image: url(test.png);

  var-b-width: 20cm;
  var-m-width: 33%;
  var-b-height: 30EM;
  var-width: .6in;
  var-length: 1.2in;
  var-web-stuff: -10Px;
  var-rgba: rgba(10,20,255);
  var-transition: color 0.4s;
  var-transform: rotate(20deg);
  var-content: "✔";
  var-text-shadow: 0 -1px 0 #bfbfbf;
  var-font-family: Gentium;
  var-src: url("http://example.com/fonts/Gentium.ttf");
  var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
  var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
  var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
  var-grid-columns: 10px ("content" 1fr 10px) [4];
}

.testIt {
  color: var(color-foreground);
  background: var(c);
  background-image: var(image);

  border-width: var(b-width);
  margin-width: var(m-width);
  border-height: var(b-height);
  width: var(width);
  length: var(length);
  -web-stuff: var(web-stuff);
  background-color: var(rgba);

  transition: var(transition);
  transform: var(transform);
  content: var(content);
  text-shadow: var(text-shadow);
}

@font-face {
  font-family: var(font-family);
  src: var(src);
  unicode-range: var(unicode-range);
}

@font-face {
  font-family: var(font-family);
  src: var(src-1);
  unicode-range: var(unicode-range-1);
}

.foobar {
    grid-columns: var(grid-columns);
}
''';

  final generated = ''':root {
  var-color-background: #f00;
  var-color-foreground: #00f;
  var-c: #0f0;
  var-b: var(c);
  var-a: var(b);
  var-image: url("test.png");
  var-b-width: 20cm;
  var-m-width: 33%;
  var-b-height: 30em;
  var-width: .6in;
  var-length: 1.2in;
  var-web-stuff: -10px;
  var-rgba: rgba(10, 20, 255);
  var-transition: color 0.4s;
  var-transform: rotate(20deg);
  var-content: "✔";
  var-text-shadow: 0 -1px 0 #bfbfbf;
  var-font-family: Gentium;
  var-src: url("http://example.com/fonts/Gentium.ttf");
  var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
  var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
  var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
  var-grid-columns: 10px ("content" 1fr 10px) [4];
}
.testIt {
  color: var(color-foreground);
  background: var(c);
  background-image: var(image);
  border-width: var(b-width);
  margin-width: var(m-width);
  border-height: var(b-height);
  width: var(width);
  length: var(length);
  -web-stuff: var(web-stuff);
  background-color: var(rgba);
  transition: var(transition);
  transform: var(transform);
  content: var(content);
  text-shadow: var(text-shadow);
}
@font-face  {
  font-family: var(font-family);
  src: var(src);
  unicode-range: var(unicode-range);
}
@font-face  {
  font-family: var(font-family);
  src: var(src-1);
  unicode-range: var(unicode-range-1);
}
.foobar {
  grid-columns: var(grid-columns);
}''';

  compileAndValidate(input, generated);

  var generatedPolyfill = r''':root {
}
.testIt {
  color: #00f;
  background: #0f0;
  background-image: url("test.png");
  border-width: 20cm;
  margin-width: 33%;
  border-height: 30em;
  width: .6in;
  length: 1.2in;
  -web-stuff: -10px;
  background-color: rgba(10, 20, 255);
  transition: color 0.4s;
  transform: rotate(20deg);
  content: "✔";
  text-shadow: 0 -1px 0 #bfbfbf;
}
@font-face  {
  font-family: Gentium;
  src: url("http://example.com/fonts/Gentium.ttf");
  unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
}
@font-face  {
  font-family: Gentium;
  src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
  unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
}
.foobar {
  grid-columns: 10px ("content" 1fr 10px) [4];
}''';

  compilePolyfillAndValidate(input, generatedPolyfill);
}

void defaultVar() {
  final input = '''
:root {
  var-color-background: red;
  var-color-foreground: blue;

  var-a: var(b, #0a0);
  var-b: var(c, #0b0);
  var-c: #00ff00;

  var-image: url(test.png);

  var-b-width: 20cm;
  var-m-width: 33%;
  var-b-height: 30EM;
}

.test {
  background-color: var(test, orange);
}

body {
  background: var(a) var(image) no-repeat right top;
}

div {
  background: var(color-background) url('img_tree.png') no-repeat right top;
}

.test-2 {
  background: var(color-background) var(image-2, url('img_1.png'))
              no-repeat right top;
}

.test-3 {
  background: var(color-background) var(image) no-repeat right top;
}

.test-4 {
  background: #ffff00 var(image) no-repeat right top;
}

.test-5 {
  background: var(test-color, var(a)) var(image) no-repeat right top;
}

.test-6 {
  border: red var(a-1, solid 20px);
}
''';

  final generated = ''':root {
  var-color-background: #f00;
  var-color-foreground: #00f;
  var-a: var(b, #0a0);
  var-b: var(c, #0b0);
  var-c: #0f0;
  var-image: url("test.png");
  var-b-width: 20cm;
  var-m-width: 33%;
  var-b-height: 30em;
}
.test {
  background-color: var(test, #ffa500);
}
body {
  background: var(a) var(image) no-repeat right top;
}
div {
  background: var(color-background) url("img_tree.png") no-repeat right top;
}
.test-2 {
  background: var(color-background) var(image-2, url("img_1.png")) no-repeat right top;
}
.test-3 {
  background: var(color-background) var(image) no-repeat right top;
}
.test-4 {
  background: #ff0 var(image) no-repeat right top;
}
.test-5 {
  background: var(test-color, var(a)) var(image) no-repeat right top;
}
.test-6 {
  border: #f00 var(a-1, solid 20px);
}''';

  compileAndValidate(input, generated);

  var generatedPolyfill = r''':root {
}
.test {
  background-color: #ffa500;
}
body {
  background: #0a0 url("test.png") no-repeat right top;
}
div {
  background: #f00 url("img_tree.png") no-repeat right top;
}
.test-2 {
  background: #f00 url("img_1.png") no-repeat right top;
}
.test-3 {
  background: #f00 url("test.png") no-repeat right top;
}
.test-4 {
  background: #ff0 url("test.png") no-repeat right top;
}
.test-5 {
  background: #0a0 url("test.png") no-repeat right top;
}
.test-6 {
  border: #f00 solid 20px;
}''';

  compilePolyfillAndValidate(input, generatedPolyfill);
}

void undefinedVars() {
  final errors = [];
  final input = ''':root {
  var-color-background: red;
  var-color-foreground: blue;

  var-a: var(b);
  var-b: var(c);
  var-c: #00ff00;

  var-one: var(two);
  var-two: var(one);

  var-four: var(five);
  var-five: var(six);
  var-six: var(four);

  var-def-1: var(def-2);
  var-def-2: var(def-3);
  var-def-3: var(def-2);
}

.testIt {
  color: var(color-foreground);
  background: var(color-background);
}
.test-1 {
  color: var(c);
}
.test-2 {
  color: var(one);
  background: var(six);
}
''';

  final generatedPolyfill = ''':root {
}
.testIt {
  color: #00f;
  background: #f00;
}
.test-1 {
  color: #0f0;
}
.test-2 {
  color: ;
  background: ;
}''';

  var errorStrings = [
    'error on line 5, column 14: Variable is not defined.\n'
        '  var-a: var(b);\n'
        '             ^^',
    'error on line 6, column 14: Variable is not defined.\n'
        '  var-b: var(c);\n'
        '             ^^',
    'error on line 9, column 16: Variable is not defined.\n'
        '  var-one: var(two);\n'
        '               ^^^^',
    'error on line 12, column 17: Variable is not defined.\n'
        '  var-four: var(five);\n'
        '                ^^^^^',
    'error on line 13, column 17: Variable is not defined.\n'
        '  var-five: var(six);\n'
        '                ^^^^',
    'error on line 16, column 18: Variable is not defined.\n'
        '  var-def-1: var(def-2);\n'
        '                 ^^^^^^',
    'error on line 17, column 18: Variable is not defined.\n'
        '  var-def-2: var(def-3);\n'
        '                 ^^^^^^',
  ];

  var generated = r''':root {
  var-color-background: #f00;
  var-color-foreground: #00f;
  var-a: var(b);
  var-b: var(c);
  var-c: #0f0;
  var-one: var(two);
  var-two: var(one);
  var-four: var(five);
  var-five: var(six);
  var-six: var(four);
  var-def-1: var(def-2);
  var-def-2: var(def-3);
  var-def-3: var(def-2);
}
.testIt {
  color: var(color-foreground);
  background: var(color-background);
}
.test-1 {
  color: var(c);
}
.test-2 {
  color: var(one);
  background: var(six);
}''';
  int testBitMap = 0;

  compileAndValidate(input, generated);

  var stylesheet =
      polyFillCompileCss(input, errors: errors..clear(), opts: options);

  expect(stylesheet != null, true);

  expect(errors.length, errorStrings.length, reason: errors.toString());
  testBitMap = 0;

  outer: for (var error in errors) {
    var errorString = error.toString();
    for (int i = 0; i < errorStrings.length; i++) {
      if (errorString == errorStrings[i]) {
        testBitMap |= 1 << i;
        continue outer;
      }
    }
    fail("Unexpected error string: $errorString");
  }
  expect(testBitMap, equals((1 << errorStrings.length) - 1));
  expect(prettyPrint(stylesheet), generatedPolyfill);
}

parserVar() {
  final input = ''':root {
  var-color-background: red;
  var-color-foreground: blue;

  var-c: #00ff00;
  var-b: var(c);
  var-a: var(b);

  var-image: url(test.png);

  var-b-width: 20cm;
  var-m-width: 33%;
  var-b-height: 30EM;
  var-width: .6in;
  var-length: 1.2in;
  var-web-stuff: -10Px;
  var-rgba: rgba(10,20,255);
  var-transition: color 0.4s;
  var-transform: rotate(20deg);
  var-content: "✔";
  var-text-shadow: 0 -1px 0 #bfbfbf;
  var-font-family: Gentium;
  var-src: url("http://example.com/fonts/Gentium.ttf");
  var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
  var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
  var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
  var-grid-columns: 10px ("content" 1fr 10px) [4];
}

.testIt {
  color: var(color-foreground);
  background: var(c);
  background-image: var(image);

  border-width: var(b-width);
  margin-width: var(m-width);
  border-height: var(b-height);
  width: var(width);
  length: var(length);
  -web-stuff: var(web-stuff);
  background-color: var(rgba);

  transition: var(transition);
  transform: var(transform);
  content: var(content);
  text-shadow: var(text-shadow);
}

@font-face {
  font-family: var(font-family);
  src: var(src);
  unicode-range: var(unicode-range);
}

@font-face {
  font-family: var(font-family);
  src: var(src-1);
  unicode-range: var(unicode-range-1);
}

.foobar {
    grid-columns: var(grid-columns);
}
''';

  final generated = ''':root {
  var-color-background: #f00;
  var-color-foreground: #00f;
  var-c: #0f0;
  var-b: var(c);
  var-a: var(b);
  var-image: url("test.png");
  var-b-width: 20cm;
  var-m-width: 33%;
  var-b-height: 30em;
  var-width: .6in;
  var-length: 1.2in;
  var-web-stuff: -10px;
  var-rgba: rgba(10, 20, 255);
  var-transition: color 0.4s;
  var-transform: rotate(20deg);
  var-content: "✔";
  var-text-shadow: 0 -1px 0 #bfbfbf;
  var-font-family: Gentium;
  var-src: url("http://example.com/fonts/Gentium.ttf");
  var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
  var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
  var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
  var-grid-columns: 10px ("content" 1fr 10px) [4];
}
.testIt {
  color: var(color-foreground);
  background: var(c);
  background-image: var(image);
  border-width: var(b-width);
  margin-width: var(m-width);
  border-height: var(b-height);
  width: var(width);
  length: var(length);
  -web-stuff: var(web-stuff);
  background-color: var(rgba);
  transition: var(transition);
  transform: var(transform);
  content: var(content);
  text-shadow: var(text-shadow);
}
@font-face  {
  font-family: var(font-family);
  src: var(src);
  unicode-range: var(unicode-range);
}
@font-face  {
  font-family: var(font-family);
  src: var(src-1);
  unicode-range: var(unicode-range-1);
}
.foobar {
  grid-columns: var(grid-columns);
}''';

  compileAndValidate(input, generated);

  var generatedPolyfill = r''':root {
}
.testIt {
  color: #00f;
  background: #0f0;
  background-image: url("test.png");
  border-width: 20cm;
  margin-width: 33%;
  border-height: 30em;
  width: .6in;
  length: 1.2in;
  -web-stuff: -10px;
  background-color: rgba(10, 20, 255);
  transition: color 0.4s;
  transform: rotate(20deg);
  content: "✔";
  text-shadow: 0 -1px 0 #bfbfbf;
}
@font-face  {
  font-family: Gentium;
  src: url("http://example.com/fonts/Gentium.ttf");
  unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
}
@font-face  {
  font-family: Gentium;
  src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
  unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
}
.foobar {
  grid-columns: 10px ("content" 1fr 10px) [4];
}''';
  compilePolyfillAndValidate(input, generatedPolyfill);
}

testVar() {
  final errors = [];
  final input = '''
@color-background: red;
@color-foreground: blue;

.test {
  background-color: var(color-background);
  color: var(color-foreground);
}
''';
  final generated = '''
var-color-background: #f00;
var-color-foreground: #00f;

.test {
  background-color: var(color-background);
  color: var(color-foreground);
}''';

  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);

  expect(stylesheet != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheet), generated);

  compileAndValidate(input, generated);

  final input2 = '''
@color-background: red;
@color-foreground: blue;

.test {
  background-color: @color-background;
  color: @color-foreground;
}
''';
  final generated2 = '''var-color-background: #f00;
var-color-foreground: #00f;

.test {
  background-color: var(color-background);
  color: var(color-foreground);
}''';

  stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);

  expect(stylesheet != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheet), generated2);

  compileAndValidate(input2, generated2);
}

testLess() {
  final errors = [];
  final input = '''
@color-background: red;
@color-foreground: blue;

.test {
  background-color: var(color-background);
  color: var(color-foreground);
}
''';
  final generated = '''var-color-background: #f00;
var-color-foreground: #00f;

.test {
  background-color: var(color-background);
  color: var(color-foreground);
}''';

  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);

  expect(stylesheet != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheet), generated);

  compileAndValidate(input, generated);

  final input2 = '''
@color-background: red;
@color-foreground: blue;

.test {
  background-color: @color-background;
  color: @color-foreground;
}
''';
  final generated2 = '''var-color-background: #f00;
var-color-foreground: #00f;

.test {
  background-color: var(color-background);
  color: var(color-foreground);
}''';

  stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);

  expect(stylesheet != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheet), generated2);

  compileAndValidate(input2, generated2);
}

void polyfill() {
  compilePolyfillAndValidate(r'''
@color-background: red;
@color-foreground: blue;
.test {
  background-color: @color-background;
  color: @color-foreground;
}''', r'''.test {
  background-color: #f00;
  color: #00f;
}''');
}

void testIndirects() {
  compilePolyfillAndValidate('''
:root {
  var-redef: #0f0;

  var-a1: #fff;
  var-a2: var(a1);
  var-a3: var(a2);

  var-redef: #000;
}
.test {
  background-color: @a1;
  color: @a2;
  border-color: @a3;
}
.test-1 {
  color: @redef;
}''', r''':root {
}
.test {
  background-color: #fff;
  color: #fff;
  border-color: #fff;
}
.test-1 {
  color: #000;
}''');
}

void includes() {
  var errors = [];
  var file1Input = r'''
:root {
  var-redef: #0f0;

  var-a1: #fff;
  var-a2: var(a1);
  var-a3: var(a2);

  var-redef: #000;
}
.test-1 {
  background-color: @a1;
  color: @a2;
  border-color: @a3;
}
.test-1a {
  color: @redef;
}
''';

  var file2Input = r'''
:root {
  var-redef: #0b0;
  var-b3: var(a3);
}
.test-2 {
  color: var(b3);
  background-color: var(redef);
  border-color: var(a3);
}
''';

  var input = r'''
:root {
  var-redef: #0c0;
}
.test-main {
  color: var(b3);
  background-color: var(redef);
  border-color: var(a3);
}
''';

  var generated1 = r''':root {
  var-redef: #0f0;
  var-a1: #fff;
  var-a2: var(a1);
  var-a3: var(a2);
  var-redef: #000;
}
.test-1 {
  background-color: var(a1);
  color: var(a2);
  border-color: var(a3);
}
.test-1a {
  color: var(redef);
}''';

  var stylesheet1 = compileCss(file1Input, errors: errors, opts: options);
  expect(stylesheet1 != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheet1), generated1);

  var generated2 = r''':root {
  var-redef: #0b0;
  var-b3: var(a3);
}
.test-2 {
  color: var(b3);
  background-color: var(redef);
  border-color: var(a3);
}''';

  var stylesheet2 = compileCss(file2Input,
      includes: [stylesheet1], errors: errors..clear(), opts: options);
  expect(stylesheet2 != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheet2), generated2);

  var generatedPolyfill1 = r''':root {
}
.test-1 {
  background-color: #fff;
  color: #fff;
  border-color: #fff;
}
.test-1a {
  color: #000;
}''';
  var styleSheet1Polyfill = compileCss(file1Input,
      errors: errors..clear(), polyfill: true, opts: options);
  expect(styleSheet1Polyfill != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(styleSheet1Polyfill), generatedPolyfill1);

  var generatedPolyfill2 = r''':root {
}
.test-2 {
  color: #fff;
  background-color: #0b0;
  border-color: #fff;
}''';
  var styleSheet2Polyfill = compileCss(file2Input,
      includes: [stylesheet1],
      errors: errors..clear(),
      polyfill: true,
      opts: options);
  expect(styleSheet2Polyfill != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(styleSheet2Polyfill), generatedPolyfill2);

  // Make sure includes didn't change.
  expect(prettyPrint(stylesheet1), generated1);

  var generatedPolyfill = r''':root {
}
.test-main {
  color: #fff;
  background-color: #0c0;
  border-color: #fff;
}''';
  var stylesheetPolyfill = compileCss(input,
      includes: [stylesheet1, stylesheet2],
      errors: errors..clear(),
      polyfill: true,
      opts: options);

  expect(stylesheetPolyfill != null, true);
  expect(errors.isEmpty, true, reason: errors.toString());
  expect(prettyPrint(stylesheetPolyfill), generatedPolyfill);

  // Make sure includes didn't change.
  expect(prettyPrint(stylesheet1), generated1);
  expect(prettyPrint(stylesheet2), generated2);
}

main() {
  test('Simple var', simpleVar);
  test('Expressions var', expressionsVar);
  test('Default value in var()', defaultVar);
  test('CSS Parser only var', parserVar);
  test('Var syntax', testVar);
  test('Indirects', testIndirects);
  test('Forward Refs', undefinedVars);
  test('Less syntax', testLess);
  test('Polyfill', polyfill);
  test('Multi-file', includes);
}
