import 'package:unittest/unittest.dart';

import 'package:mustache/src/node.dart';
import 'package:mustache/src/parser.dart';
import 'package:mustache/src/scanner.dart';
import 'package:mustache/src/template_exception.dart';
import 'package:mustache/src/token.dart';

main() {
    
  group('Scanner', () {

    test('scan text', () {
      var source = 'abc';
      var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
      var tokens = scanner.scan();
      expectTokens(tokens, [ new Token(TokenType.text, 'abc', 0, 3)]);
    });
    
    test('scan tag', () {
      var source = 'abc{{foo}}def';     
      var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
      var tokens = scanner.scan();
      expectTokens(tokens, [
        new Token(TokenType.text, 'abc', 0, 3),
        new Token(TokenType.openDelimiter, '{{', 3, 5),
        new Token(TokenType.identifier, 'foo', 5, 8),
        new Token(TokenType.closeDelimiter, '}}', 8, 10),
        new Token(TokenType.text, 'def', 10, 13)
      ]);
    });
     
   test('scan tag whitespace', () {
     var source = 'abc{{ foo }}def';
     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
     var tokens = scanner.scan();
     expectTokens(tokens, [
       new Token(TokenType.text, 'abc', 0, 3),
       new Token(TokenType.openDelimiter, '{{', 3, 5),
       new Token(TokenType.whitespace, ' ', 5, 6),
       new Token(TokenType.identifier, 'foo', 6, 9),
       new Token(TokenType.whitespace, ' ', 9, 10),
       new Token(TokenType.closeDelimiter, '}}', 10, 12),
       new Token(TokenType.text, 'def', 12, 15)
     ]);
   });
   
   test('scan tag sigil', () {
     var source = 'abc{{ # foo }}def';
     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
     var tokens = scanner.scan();
     expectTokens(tokens, [
       new Token(TokenType.text, 'abc', 0, 3),
       new Token(TokenType.openDelimiter, '{{', 3, 5),
       new Token(TokenType.whitespace, ' ', 5, 6),
       new Token(TokenType.sigil, '#', 6, 7),
       new Token(TokenType.whitespace, ' ', 7, 8),
       new Token(TokenType.identifier, 'foo', 8, 11),
       new Token(TokenType.whitespace, ' ', 11, 12),
       new Token(TokenType.closeDelimiter, '}}', 12, 14),
       new Token(TokenType.text, 'def', 14, 17)
     ]);
   });

   test('scan tag dot', () {
     var source = 'abc{{ foo.bar }}def';
     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
     var tokens = scanner.scan();
     expectTokens(tokens, [
       new Token(TokenType.text, 'abc', 0, 3),
       new Token(TokenType.openDelimiter, '{{', 3, 5),
       new Token(TokenType.whitespace, ' ', 5, 6),
       new Token(TokenType.identifier, 'foo', 6, 9),
       new Token(TokenType.dot, '.', 9, 10),
       new Token(TokenType.identifier, 'bar', 10, 13),
       new Token(TokenType.whitespace, ' ', 13, 14),
       new Token(TokenType.closeDelimiter, '}}', 14, 16),
       new Token(TokenType.text, 'def', 16, 19)
     ]);
   });

   test('scan triple mustache', () {
     var source = 'abc{{{foo}}}def';     
     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
     var tokens = scanner.scan();
     expectTokens(tokens, [
       new Token(TokenType.text, 'abc', 0, 3),
       new Token(TokenType.openDelimiter, '{{{', 3, 6),
       new Token(TokenType.identifier, 'foo', 6, 9),
       new Token(TokenType.closeDelimiter, '}}}', 9, 12),
       new Token(TokenType.text, 'def', 12, 15)
     ]);
   });

   
   test('scan triple mustache whitespace', () {
     var source = 'abc{{{ foo }}}def';
     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
     var tokens = scanner.scan();
     expectTokens(tokens, [
       new Token(TokenType.text, 'abc', 0, 3),
       new Token(TokenType.openDelimiter, '{{{', 3, 6),
       new Token(TokenType.whitespace, ' ', 6, 7),
       new Token(TokenType.identifier, 'foo', 7, 10),
       new Token(TokenType.whitespace, ' ', 10, 11),
       new Token(TokenType.closeDelimiter, '}}}', 11, 14),
       new Token(TokenType.text, 'def', 14, 17)
     ]);
   });
  });
   
  group('Parser', () {
    
   test('parse variable', () {
     var source = 'abc{{foo}}def';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new TextNode('abc', 0, 3),
       new VariableNode('foo', 3, 10, escape: true),
       new TextNode('def', 10, 13)
     ]);
   });

   test('parse variable whitespace', () {
     var source = 'abc{{ foo }}def';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new TextNode('abc', 0, 3),
       new VariableNode('foo', 3, 12, escape: true),
       new TextNode('def', 12, 15)
     ]);
   });
   
   test('parse section', () {
     var source = 'abc{{#foo}}def{{/foo}}ghi';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new TextNode('abc', 0, 3),
       new SectionNode('foo', 3, 11, '{{ }}'),
       new TextNode('ghi', 22, 25)
     ]);
     expectNodes(nodes[1].children, [new TextNode('def', 11, 14)]);
   });

   test('parse section standalone tag whitespace', () {
     var source = 'abc\n{{#foo}}\ndef\n{{/foo}}\nghi';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new TextNode('abc\n', 0, 4),
       new SectionNode('foo', 4, 12, '{{ }}'),
       new TextNode('ghi', 26, 29)
     ]);
     expectNodes(nodes[1].children, [new TextNode('def\n', 13, 17)]);
   });

   test('parse section standalone tag whitespace consecutive', () {
     var source = 'abc\n{{#foo}}\ndef\n{{/foo}}\n{{#foo}}\ndef\n{{/foo}}\nghi';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new TextNode('abc\n', 0, 4),
       new SectionNode('foo', 4, 12, '{{ }}'),
       new SectionNode('foo', 26, 34, '{{ }}'),
       new TextNode('ghi', 48, 51),
     ]);
     expectNodes(nodes[1].children, [new TextNode('def\n', 13, 17)]);
   });
   
   test('parse section standalone tag whitespace on first line', () {
     var source = '  {{#foo}}  \ndef\n{{/foo}}\nghi';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new SectionNode('foo', 2, 10, '{{ }}'),
       new TextNode('ghi', 26, 29)
     ]);
     expectNodes(nodes[0].children, [new TextNode('def\n', 13, 17)]);
   });

   test('parse section standalone tag whitespace on last line', () {
     var source = '{{#foo}}def\n  {{/foo}}  ';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new SectionNode('foo', 0, 8, '{{ }}')
     ]);
     expectNodes(nodes[0].children, [new TextNode('def\n', 8, 12)]);
   });
   
   test('parse whitespace', () {
     var source = 'abc\n   ';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new TextNode('abc\n   ', 0, 7),
     ]);
   });
   
   test('parse partial', () {
     var source = 'abc\n   {{>foo}}def';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new TextNode('abc\n   ', 0, 7),
       new PartialNode('foo', 7, 15, '   '),
       new TextNode('def', 15, 18)
     ]);
   });

   test('parse change delimiters', () {
     var source = '{{= | | =}}<|#lambda|-|/lambda|>';
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     var nodes = parser.parse();
     expect(nodes[1].delimiters, equals('| |'));
     expectNodes(nodes, [
       new TextNode('<', 11, 12),
       new SectionNode('lambda', 12, 21, '| |'),
       new TextNode('>', 31, 32),
     ]);
     expectNodes(nodes[1].children, [new TextNode('-', 21, 22)]);
   });   
   
   test('corner case strict', () {
     var source = "{{{ #foo }}} {{{ /foo }}}";
     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
     try {
      var nodes = parser.parse();
      fail('Should fail.');
     } catch (e) {
       expect(e is TemplateException, isTrue);
     }
   });

   test('corner case lenient', () {
     var source = "{{{ #foo }}} {{{ /foo }}}";
     var parser = new Parser(source, 'foo', '{{ }}', lenient: true);
     var nodes = parser.parse();
     expectNodes(nodes, [
       new VariableNode('#foo', 0, 12, escape: false),
       new TextNode(' ', 12, 13),
       new VariableNode('/foo', 13, 25, escape: false)
     ]);     
   });
   
   test('toString', () {
     new TextNode('foo', 1, 3).toString();
     new VariableNode('foo', 1, 3).toString();
     new PartialNode('foo', 1, 3, ' ').toString();
     new SectionNode('foo', 1, 3, '{{ }}').toString();
     new Token(TokenType.closeDelimiter, 'foo', 1, 3).toString();
     TokenType.closeDelimiter.toString();
   });
   
   test('exception', () {
     var source = "'{{ foo }} sdfffffffffffffffffffffffffffffffffffffffffffff "
         "dsfsdf sdfdsa fdsfads fsdfdsfadsf dsfasdfsdf sdfdsfsadf sdfadsfsdf ";
       var ex = new TemplateException('boom!', 'foo.mustache', source, 2);
       ex.toString();
   });
   
  parseFail(source) {
     try {
       var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
       parser.parse();
       fail('Did not throw.');
       return null;
     } catch (ex, st) {
       if (ex is! TemplateException) {
        print(ex);
        print(st);
       }
       return ex;
     }
   }
   
   test('parse eof', () {
     expectTemplateEx(ex) => expect(ex is TemplateException, isTrue);
     
     expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo}'));
     expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo'));
     expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/'));
     expectTemplateEx(parseFail('{{#foo}}{{bar}}{{'));
     expectTemplateEx(parseFail('{{#foo}}{{bar}}{'));
     expectTemplateEx(parseFail('{{#foo}}{{bar}}'));
     expectTemplateEx(parseFail('{{#foo}}{{bar}'));
     expectTemplateEx(parseFail('{{#foo}}{{bar'));
     expectTemplateEx(parseFail('{{#foo}}{{'));
     expectTemplateEx(parseFail('{{#foo}}{'));
     expectTemplateEx(parseFail('{{#foo}}'));
     expectTemplateEx(parseFail('{{#foo}'));
     expectTemplateEx(parseFail('{{#'));
     expectTemplateEx(parseFail('{{'));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo }'));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo '));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo'));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / '));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ /'));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ '));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{'));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{'));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}'));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar }'));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar '));
     expectTemplateEx(parseFail('{{ # foo }}{{ bar'));
     expectTemplateEx(parseFail('{{ # foo }}{{ '));
     expectTemplateEx(parseFail('{{ # foo }}{{'));
     expectTemplateEx(parseFail('{{ # foo }}{'));
     expectTemplateEx(parseFail('{{ # foo }}'));
     expectTemplateEx(parseFail('{{ # foo }'));
     expectTemplateEx(parseFail('{{ # foo '));
     expectTemplateEx(parseFail('{{ # foo'));
     expectTemplateEx(parseFail('{{ # '));
     expectTemplateEx(parseFail('{{ #'));
     expectTemplateEx(parseFail('{{ '));
     expectTemplateEx(parseFail('{{'));
     
     expectTemplateEx(parseFail('{{= || || =}'));
     expectTemplateEx(parseFail('{{= || || ='));
     expectTemplateEx(parseFail('{{= || || '));
     expectTemplateEx(parseFail('{{= || ||'));
     expectTemplateEx(parseFail('{{= || |'));
     expectTemplateEx(parseFail('{{= || '));
     expectTemplateEx(parseFail('{{= ||'));
     expectTemplateEx(parseFail('{{= |'));
     expectTemplateEx(parseFail('{{= '));
     expectTemplateEx(parseFail('{{='));
   });
   
  });
  
}

nodeEqual(a, b) {
  if (a is TextNode) {
    return b is TextNode
        && a.text == b.text
        && a.start == b.start
        && a.end == b.end;
  
  } else if (a is VariableNode) {
    return a is VariableNode
        && a.name == b.name
        && a.escape == b.escape
        && a.start == b.start
        && a.end == b.end;

  } else if (a is SectionNode) {
    return a is SectionNode
        && a.name == b.name
        && a.delimiters == b.delimiters
        && a.inverse == b.inverse
        && a.start == b.start
        && a.end == b.end;
    
  } else if (a is PartialNode) {
    return a is PartialNode
        && a.name == b.name
        && a.indent == b.indent;
    
  } else {
    return false;
  }
}

tokenEqual(Token a, Token b) {    
  return a is Token
      && a.type == b.type
      && a.value == b.value
      && a.start == b.start
      && a.end == b.end;
}

expectTokens(List<Token> a, List<Token> b) {
  expect(a.length, equals(b.length), reason: "$a != $b");
  for (var i = 0; i < a.length; i++) {
    expect(tokenEqual(a[i], b[i]), isTrue, reason: "$a != $b");
  }
}

expectNodes(List<Node> a, List<Node> b) {
  expect(a.length, equals(b.length), reason: "$a != $b");
  for (var i = 0; i < a.length; i++) {
    expect(nodeEqual(a[i], b[i]), isTrue, reason: "$a != $b");
  }
}
