// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter_tools/src/localizations/gen_l10n_types.dart';
import 'package:flutter_tools/src/localizations/message_parser.dart';
import '../src/common.dart';

void main() {
  // Going to test that operator== is overloaded properly since the rest
  // of the test depends on it.
  testWithoutContext('node equality', () {
    final Node actual = Node(
      ST.placeholderExpr,
      0,
      expectedSymbolCount: 3,
      children: <Node>[
        Node.openBrace(0),
        Node.string(1, 'var'),
        Node.closeBrace(4),
      ],
    );

    final Node expected = Node(
      ST.placeholderExpr,
      0,
      expectedSymbolCount: 3,
      children: <Node>[
        Node.openBrace(0),
        Node.string(1, 'var'),
        Node.closeBrace(4),
      ],
    );
    expect(actual, equals(expected));

    final Node wrongType = Node(
      ST.pluralExpr,
      0,
      expectedSymbolCount: 3,
      children: <Node>[
        Node.openBrace(0),
        Node.string(1, 'var'),
        Node.closeBrace(4),
      ],
    );
    expect(actual, isNot(equals(wrongType)));

    final Node wrongPosition = Node(
      ST.placeholderExpr,
      1,
      expectedSymbolCount: 3,
      children: <Node>[
        Node.openBrace(0),
        Node.string(1, 'var'),
        Node.closeBrace(4),
      ],
    );
    expect(actual, isNot(equals(wrongPosition)));

    final Node wrongChildrenCount = Node(
      ST.placeholderExpr,
      0,
      expectedSymbolCount: 3,
      children: <Node>[
        Node.string(1, 'var'),
        Node.closeBrace(4),
      ],
    );
    expect(actual, isNot(equals(wrongChildrenCount)));

    final Node wrongChild = Node(
      ST.placeholderExpr,
      0,
      expectedSymbolCount: 3,
      children: <Node>[
        Node.closeBrace(0),
        Node.string(1, 'var'),
        Node.closeBrace(4),
      ],
    );
    expect(actual, isNot(equals(wrongChild)));
  });

  testWithoutContext('lexer basic', () {
    final List<Node> tokens1 = Parser(
      'helloWorld',
      'app_en.arb',
      'Hello {name}'
    ).lexIntoTokens();
    expect(tokens1, equals(<Node>[
      Node.string(0, 'Hello '),
      Node.openBrace(6),
      Node.identifier(7, 'name'),
      Node.closeBrace(11),
    ]));

    final List<Node> tokens2 = Parser(
      'plural',
      'app_en.arb',
      'There are {count} {count, plural, =1{cat} other{cats}}'
    ).lexIntoTokens();
    expect(tokens2, equals(<Node>[
      Node.string(0, 'There are '),
      Node.openBrace(10),
      Node.identifier(11, 'count'),
      Node.closeBrace(16),
      Node.string(17, ' '),
      Node.openBrace(18),
      Node.identifier(19, 'count'),
      Node.comma(24),
      Node.pluralKeyword(26),
      Node.comma(32),
      Node.equalSign(34),
      Node.number(35, '1'),
      Node.openBrace(36),
      Node.string(37, 'cat'),
      Node.closeBrace(40),
      Node.otherKeyword(42),
      Node.openBrace(47),
      Node.string(48, 'cats'),
      Node.closeBrace(52),
      Node.closeBrace(53),
    ]));

    final List<Node> tokens3 = Parser(
      'gender',
      'app_en.arb',
      '{gender, select, male{he} female{she} other{they}}'
    ).lexIntoTokens();
    expect(tokens3, equals(<Node>[
      Node.openBrace(0),
      Node.identifier(1, 'gender'),
      Node.comma(7),
      Node.selectKeyword(9),
      Node.comma(15),
      Node.identifier(17, 'male'),
      Node.openBrace(21),
      Node.string(22, 'he'),
      Node.closeBrace(24),
      Node.identifier(26, 'female'),
      Node.openBrace(32),
      Node.string(33, 'she'),
      Node.closeBrace(36),
      Node.otherKeyword(38),
      Node.openBrace(43),
      Node.string(44, 'they'),
      Node.closeBrace(48),
      Node.closeBrace(49),
    ]));
  });

  testWithoutContext('lexer recursive', () {
    final List<Node> tokens = Parser(
      'plural',
      'app_en.arb',
      '{count, plural, =1{{gender, select, male{he} female{she}}} other{they}}'
    ).lexIntoTokens();
    expect(tokens, equals(<Node>[
      Node.openBrace(0),
      Node.identifier(1, 'count'),
      Node.comma(6),
      Node.pluralKeyword(8),
      Node.comma(14),
      Node.equalSign(16),
      Node.number(17, '1'),
      Node.openBrace(18),
      Node.openBrace(19),
      Node.identifier(20, 'gender'),
      Node.comma(26),
      Node.selectKeyword(28),
      Node.comma(34),
      Node.identifier(36, 'male'),
      Node.openBrace(40),
      Node.string(41, 'he'),
      Node.closeBrace(43),
      Node.identifier(45, 'female'),
      Node.openBrace(51),
      Node.string(52, 'she'),
      Node.closeBrace(55),
      Node.closeBrace(56),
      Node.closeBrace(57),
      Node.otherKeyword(59),
      Node.openBrace(64),
      Node.string(65, 'they'),
      Node.closeBrace(69),
      Node.closeBrace(70),
    ]));
  });

  testWithoutContext('lexer escaping', () {
    final List<Node> tokens1 = Parser('escaping', 'app_en.arb', "''", useEscaping: true).lexIntoTokens();
    expect(tokens1, equals(<Node>[Node.string(0, "'")]));

    final List<Node> tokens2 = Parser('escaping', 'app_en.arb', "'hello world { name }'", useEscaping: true).lexIntoTokens();
    expect(tokens2, equals(<Node>[Node.string(0, 'hello world { name }')]));

    final List<Node> tokens3 = Parser('escaping', 'app_en.arb', "'{ escaped string }' { not escaped }", useEscaping: true).lexIntoTokens();
    expect(tokens3, equals(<Node>[
      Node.string(0, '{ escaped string }'),
      Node.string(20, ' '),
      Node.openBrace(21),
      Node.identifier(23, 'not'),
      Node.identifier(27, 'escaped'),
      Node.closeBrace(35),
    ]));

    final List<Node> tokens4 = Parser('escaping', 'app_en.arb', "Flutter''s amazing!", useEscaping: true).lexIntoTokens();
    expect(tokens4, equals(<Node>[
      Node.string(0, 'Flutter'),
      Node.string(7, "'"),
      Node.string(9, 's amazing!'),
    ]));

    final List<Node> tokens5 = Parser('escaping', 'app_en.arb', "'Flutter''s amazing!'", useEscaping: true).lexIntoTokens();
    expect(tokens5, equals(<Node>[
      Node(ST.string, 0, value: 'Flutter'),
      Node(ST.string, 9, value: "'s amazing!"),
    ]));
  });

  testWithoutContext('lexer identifier names can be "select" or "plural"', () {
    final List<Node> tokens = Parser('keywords', 'app_en.arb', '{ select } { plural, select, singular{test} other{hmm} }').lexIntoTokens();
    expect(tokens[1].value, equals('select'));
    expect(tokens[1].type, equals(ST.identifier));
    expect(tokens[5].value, equals('plural'));
    expect(tokens[5].type, equals(ST.identifier));
  });

  testWithoutContext('lexer: lexically correct but syntactically incorrect', () {
    final List<Node> tokens = Parser(
      'syntax',
      'app_en.arb',
      'string { identifier { string { identifier } } }'
    ).lexIntoTokens();
    expect(tokens, equals(<Node>[
      Node.string(0, 'string '),
      Node.openBrace(7),
      Node.identifier(9, 'identifier'),
      Node.openBrace(20),
      Node.string(21, ' string '),
      Node.openBrace(29),
      Node.identifier(31, 'identifier'),
      Node.closeBrace(42),
      Node.string(43, ' '),
      Node.closeBrace(44),
      Node.closeBrace(46),
    ]));
  });

  testWithoutContext('lexer unmatched single quote', () {
    const String message = "here''s an unmatched single quote: '";
    const String expectedError = '''
[app_en.arb:escaping] ICU Lexing Error: Unmatched single quotes.
    here''s an unmatched single quote: '
                                       ^''';
    expect(
      () => Parser('escaping', 'app_en.arb', message, useEscaping: true).lexIntoTokens(),
      throwsA(isA<L10nException>().having(
        (L10nException e) => e.message,
        'message',
        contains(expectedError),
    )));
  });

  testWithoutContext('lexer unexpected character', () {
    const String message = '{ * }';
    const String expectedError = '''
[app_en.arb:lex] ICU Lexing Error: Unexpected character.
    { * }
      ^''';
    expect(
      () => Parser('lex', 'app_en.arb', message).lexIntoTokens(),
      throwsA(isA<L10nException>().having(
        (L10nException e) => e.message,
        'message',
        contains(expectedError),
    )));
  });


  testWithoutContext('parser basic', () {
    expect(Parser('helloWorld', 'app_en.arb', 'Hello {name}').parse(), equals(
      Node(ST.message, 0, children: <Node>[
        Node(ST.string, 0, value: 'Hello '),
          Node(ST.placeholderExpr, 6, children: <Node>[
            Node(ST.openBrace, 6, value: '{'),
            Node(ST.identifier, 7, value: 'name'),
            Node(ST.closeBrace, 11, value: '}')
          ])
        ])
    ));

    expect(Parser(
      'plural',
      'app_en.arb',
      'There are {count} {count, plural, =1{cat} other{cats}}'
    ).parse(), equals(
      Node(ST.message, 0, children: <Node>[
        Node(ST.string, 0, value: 'There are '),
        Node(ST.placeholderExpr, 10, children: <Node>[
          Node(ST.openBrace, 10, value: '{'),
          Node(ST.identifier, 11, value: 'count'),
          Node(ST.closeBrace, 16, value: '}')
        ]),
        Node(ST.string, 17, value: ' '),
        Node(ST.pluralExpr, 18, children: <Node>[
          Node(ST.openBrace, 18, value: '{'),
          Node(ST.identifier, 19, value: 'count'),
          Node(ST.comma, 24, value: ','),
          Node(ST.plural, 26, value: 'plural'),
          Node(ST.comma, 32, value: ','),
          Node(ST.pluralParts, 34, children: <Node>[
            Node(ST.pluralPart, 34, children: <Node>[
              Node(ST.equalSign, 34, value: '='),
              Node(ST.number, 35, value: '1'),
              Node(ST.openBrace, 36, value: '{'),
              Node(ST.message, 37, children: <Node>[
                Node(ST.string, 37, value: 'cat')
              ]),
              Node(ST.closeBrace, 40, value: '}')
            ]),
            Node(ST.pluralPart, 42, children: <Node>[
              Node(ST.other, 42, value: 'other'),
              Node(ST.openBrace, 47, value: '{'),
              Node(ST.message, 48, children: <Node>[
                Node(ST.string, 48, value: 'cats')
              ]),
              Node(ST.closeBrace, 52, value: '}')
            ])
          ]),
          Node(ST.closeBrace, 53, value: '}')
        ]),
      ]),
    ));

    expect(Parser(
      'gender',
      'app_en.arb',
      '{gender, select, male{he} female{she} other{they}}'
    ).parse(), equals(
      Node(ST.message, 0, children: <Node>[
        Node(ST.selectExpr, 0, children: <Node>[
          Node(ST.openBrace, 0, value: '{'),
          Node(ST.identifier, 1, value: 'gender'),
          Node(ST.comma, 7, value: ','),
          Node(ST.select, 9, value: 'select'),
          Node(ST.comma, 15, value: ','),
          Node(ST.selectParts, 17, children: <Node>[
            Node(ST.selectPart, 17, children: <Node>[
              Node(ST.identifier, 17, value: 'male'),
              Node(ST.openBrace, 21, value: '{'),
              Node(ST.message, 22, children: <Node>[
                Node(ST.string, 22, value: 'he'),
              ]),
              Node(ST.closeBrace, 24, value: '}'),
            ]),
            Node(ST.selectPart, 26, children: <Node>[
              Node(ST.identifier, 26, value: 'female'),
              Node(ST.openBrace, 32, value: '{'),
              Node(ST.message, 33, children: <Node>[
                Node(ST.string, 33, value: 'she'),
              ]),
              Node(ST.closeBrace, 36, value: '}'),
            ]),
            Node(ST.selectPart, 38, children: <Node>[
              Node(ST.other, 38, value: 'other'),
              Node(ST.openBrace, 43, value: '{'),
              Node(ST.message, 44, children: <Node>[
                Node(ST.string, 44, value: 'they'),
              ]),
              Node(ST.closeBrace, 48, value: '}'),
            ]),
          ]),
          Node(ST.closeBrace, 49, value: '}'),
        ]),
      ])
    ));
  });

  testWithoutContext('parser escaping', () {
    expect(Parser('escaping', 'app_en.arb', "Flutter''s amazing!", useEscaping: true).parse(), equals(
      Node(ST.message, 0, children: <Node>[
        Node(ST.string, 0, value: 'Flutter'),
        Node(ST.string, 7, value: "'"),
        Node(ST.string, 9, value: 's amazing!'),
      ])
    ));

    expect(Parser('escaping', 'app_en.arb', "'Flutter''s amazing!'", useEscaping: true).parse(), equals(
      Node(ST.message, 0, children: <Node> [
        Node(ST.string, 0, value: 'Flutter'),
        Node(ST.string, 9, value: "'s amazing!"),
      ])
    ));
  });

  testWithoutContext('parser recursive', () {
    expect(Parser(
      'pluralGender',
      'app_en.arb',
      '{count, plural, =1{{gender, select, male{he} female{she} other{they}}} other{they}}'
    ).parse(), equals(
      Node(ST.message, 0, children: <Node>[
        Node(ST.pluralExpr, 0, children: <Node>[
          Node(ST.openBrace, 0, value: '{'),
          Node(ST.identifier, 1, value: 'count'),
          Node(ST.comma, 6, value: ','),
          Node(ST.plural, 8, value: 'plural'),
          Node(ST.comma, 14, value: ','),
          Node(ST.pluralParts, 16, children: <Node>[
            Node(ST.pluralPart, 16, children: <Node>[
              Node(ST.equalSign, 16, value: '='),
              Node(ST.number, 17, value: '1'),
              Node(ST.openBrace, 18, value: '{'),
              Node(ST.message, 19, children: <Node>[
                Node(ST.selectExpr, 19, children: <Node>[
                  Node(ST.openBrace, 19, value: '{'),
                  Node(ST.identifier, 20, value: 'gender'),
                  Node(ST.comma, 26, value: ','),
                  Node(ST.select, 28, value: 'select'),
                  Node(ST.comma, 34, value: ','),
                  Node(ST.selectParts, 36, children: <Node>[
                    Node(ST.selectPart, 36, children: <Node>[
                      Node(ST.identifier, 36, value: 'male'),
                      Node(ST.openBrace, 40, value: '{'),
                      Node(ST.message, 41, children: <Node>[
                        Node(ST.string, 41, value: 'he'),
                      ]),
                      Node(ST.closeBrace, 43, value: '}'),
                    ]),
                    Node(ST.selectPart, 45, children: <Node>[
                      Node(ST.identifier, 45, value: 'female'),
                      Node(ST.openBrace, 51, value: '{'),
                      Node(ST.message, 52, children: <Node>[
                        Node(ST.string, 52, value: 'she'),
                      ]),
                      Node(ST.closeBrace, 55, value: '}'),
                    ]),
                    Node(ST.selectPart, 57, children: <Node>[
                      Node(ST.other, 57, value: 'other'),
                      Node(ST.openBrace, 62, value: '{'),
                      Node(ST.message, 63, children: <Node>[
                        Node(ST.string, 63, value: 'they'),
                      ]),
                      Node(ST.closeBrace, 67, value: '}'),
                    ]),
                  ]),
                  Node(ST.closeBrace, 68, value: '}'),
                ]),
              ]),
              Node(ST.closeBrace, 69, value: '}'),
            ]),
            Node(ST.pluralPart, 71, children: <Node>[
              Node(ST.other, 71, value: 'other'),
              Node(ST.openBrace, 76, value: '{'),
              Node(ST.message, 77, children: <Node>[
                Node(ST.string, 77, value: 'they'),
              ]),
              Node(ST.closeBrace, 81, value: '}'),
            ]),
          ]),
          Node(ST.closeBrace, 82, value: '}'),
        ]),
      ])
    ));
  });

  testWithoutContext('parser unexpected token', () {
    // unexpected token
    const String expectedError1 = '''
[app_en.arb:unexpectedToken] ICU Syntax Error: Expected "}" but found "=".
    { placeholder =
                  ^''';
    expect(
      () => Parser('unexpectedToken', 'app_en.arb', '{ placeholder =').parseIntoTree(),
      throwsA(isA<L10nException>().having(
        (L10nException e) => e.message,
        'message',
        contains(expectedError1),
    )));

    const String expectedError2 = '''
[app_en.arb:unexpectedToken] ICU Syntax Error: Expected "number" but found "}".
    { count, plural, = }
                       ^''';
    expect(
      () => Parser('unexpectedToken', 'app_en.arb', '{ count, plural, = }').parseIntoTree(),
      throwsA(isA<L10nException>().having(
        (L10nException e) => e.message,
        'message',
        contains(expectedError2),
    )));

    const String expectedError3 = '''
[app_en.arb:unexpectedToken] ICU Syntax Error: Expected "identifier" but found ",".
    { , plural , = }
      ^''';
    expect(
      () => Parser('unexpectedToken', 'app_en.arb', '{ , plural , = }').parseIntoTree(),
      throwsA(isA<L10nException>().having(
        (L10nException e) => e.message,
        'message',
        contains(expectedError3),
    )));
  });

  testWithoutContext('parser allows select cases with numbers', () {
    final Node node = Parser('numberSelect', 'app_en.arb', '{ count, select, 0{none} 100{perfect} other{required!} }').parse();
    final Node selectExpr = node.children[0];
    final Node selectParts = selectExpr.children[5];
    final Node selectPart = selectParts.children[0];
    expect(selectPart.children[0].value, equals('0'));
    expect(selectPart.children[1].value, equals('{'));
    expect(selectPart.children[2].type, equals(ST.message));
    expect(selectPart.children[3].value, equals('}'));
  });
}
