// Copyright (c) 2016, 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.

import 'package:test/test.dart';

import 'package:boolean_selector/src/scanner.dart';
import 'package:boolean_selector/src/token.dart';

void main() {
  group('peek()', () {
    test('returns the next token without consuming it', () {
      var scanner = Scanner('( )');
      expect(scanner.peek().type, equals(TokenType.leftParen));
      expect(scanner.peek().type, equals(TokenType.leftParen));
      expect(scanner.peek().type, equals(TokenType.leftParen));
    });

    test('returns an end-of-file token at the end of a file', () {
      var scanner = Scanner('( )');
      scanner.next();
      scanner.next();

      var token = scanner.peek();
      expect(token.type, equals(TokenType.endOfFile));
      expect(token.span.start.offset, equals(3));
      expect(token.span.end.offset, equals(3));
    });

    test('throws a StateError if called after end-of-file was consumed', () {
      var scanner = Scanner('( )');
      scanner.next();
      scanner.next();
      scanner.next();
      expect(() => scanner.peek(), throwsStateError);
    });
  });

  group('next()', () {
    test('consumes and returns the next token', () {
      var scanner = Scanner('( )');
      expect(scanner.next().type, equals(TokenType.leftParen));
      expect(scanner.peek().type, equals(TokenType.rightParen));
      expect(scanner.next().type, equals(TokenType.rightParen));
    });

    test('returns an end-of-file token at the end of a file', () {
      var scanner = Scanner('( )');
      scanner.next();
      scanner.next();

      var token = scanner.next();
      expect(token.type, equals(TokenType.endOfFile));
      expect(token.span.start.offset, equals(3));
      expect(token.span.end.offset, equals(3));
    });

    test('throws a StateError if called after end-of-file was consumed', () {
      var scanner = Scanner('( )');
      scanner.next();
      scanner.next();
      scanner.next();
      expect(() => scanner.next(), throwsStateError);
    });
  });

  group('scan()', () {
    test('consumes a matching token and returns true', () {
      var scanner = Scanner('( )');
      expect(scanner.scan(TokenType.leftParen), isTrue);
      expect(scanner.peek().type, equals(TokenType.rightParen));
    });

    test("doesn't consume a matching token and returns false", () {
      var scanner = Scanner('( )');
      expect(scanner.scan(TokenType.questionMark), isFalse);
      expect(scanner.peek().type, equals(TokenType.leftParen));
    });

    test('throws a StateError called after end-of-file was consumed', () {
      var scanner = Scanner('( )');
      scanner.next();
      scanner.next();
      scanner.next();
      expect(() => scanner.scan(TokenType.endOfFile), throwsStateError);
    });
  });

  group('scans a simple token:', () {
    test('left paren', () => _expectSimpleScan('(', TokenType.leftParen));
    test('right paren', () => _expectSimpleScan(')', TokenType.rightParen));
    test('or', () => _expectSimpleScan('||', TokenType.or));
    test('and', () => _expectSimpleScan('&&', TokenType.and));
    test('not', () => _expectSimpleScan('!', TokenType.not));
    test('question mark', () => _expectSimpleScan('?', TokenType.questionMark));
    test('colon', () => _expectSimpleScan(':', TokenType.colon));
  });

  group('scans an identifier that', () {
    test('is simple', () {
      var token = _scan('   foo  ');
      expect(token.name, equals('foo'));
      expect(token.span.text, equals('foo'));
      expect(token.span.start.offset, equals(3));
      expect(token.span.end.offset, equals(6));
    });

    test('is a single character', () {
      var token = _scan('f');
      expect(token.name, equals('f'));
    });

    test('has a leading underscore', () {
      var token = _scan('_foo');
      expect(token.name, equals('_foo'));
    });

    test('has a leading dash', () {
      var token = _scan('-foo');
      expect(token.name, equals('-foo'));
    });

    test('contains an underscore', () {
      var token = _scan('foo_bar');
      expect(token.name, equals('foo_bar'));
    });

    test('contains a dash', () {
      var token = _scan('foo-bar');
      expect(token.name, equals('foo-bar'));
    });

    test('is capitalized', () {
      var token = _scan('FOO');
      expect(token.name, equals('FOO'));
    });

    test('contains numbers', () {
      var token = _scan('foo123');
      expect(token.name, equals('foo123'));
    });
  });

  test('scans an empty selector', () {
    expect(_scan('').type, equals(TokenType.endOfFile));
  });

  test('scans multiple tokens', () {
    var scanner = Scanner('(foo && bar)');

    var token = scanner.next();
    expect(token.type, equals(TokenType.leftParen));
    expect(token.span.start.offset, equals(0));
    expect(token.span.end.offset, equals(1));

    token = scanner.next();
    expect(token.type, equals(TokenType.identifier));
    expect((token as IdentifierToken).name, equals('foo'));
    expect(token.span.start.offset, equals(1));
    expect(token.span.end.offset, equals(4));

    token = scanner.next();
    expect(token.type, equals(TokenType.and));
    expect(token.span.start.offset, equals(5));
    expect(token.span.end.offset, equals(7));

    token = scanner.next();
    expect(token.type, equals(TokenType.identifier));
    expect((token as IdentifierToken).name, equals('bar'));
    expect(token.span.start.offset, equals(8));
    expect(token.span.end.offset, equals(11));

    token = scanner.next();
    expect(token.type, equals(TokenType.rightParen));
    expect(token.span.start.offset, equals(11));
    expect(token.span.end.offset, equals(12));

    token = scanner.next();
    expect(token.type, equals(TokenType.endOfFile));
    expect(token.span.start.offset, equals(12));
    expect(token.span.end.offset, equals(12));
  });

  group('ignores', () {
    test('a single-line comment', () {
      var scanner = Scanner('( // &&\n// ||\n)');
      expect(scanner.next().type, equals(TokenType.leftParen));
      expect(scanner.next().type, equals(TokenType.rightParen));
      expect(scanner.next().type, equals(TokenType.endOfFile));
    });

    test('a single-line comment without a trailing newline', () {
      var scanner = Scanner('( // &&');
      expect(scanner.next().type, equals(TokenType.leftParen));
      expect(scanner.next().type, equals(TokenType.endOfFile));
    });

    test('a multi-line comment', () {
      var scanner = Scanner('( /* && * /\n|| */\n)');
      expect(scanner.next().type, equals(TokenType.leftParen));
      expect(scanner.next().type, equals(TokenType.rightParen));
      expect(scanner.next().type, equals(TokenType.endOfFile));
    });

    test('a multi-line nested comment', () {
      var scanner = Scanner('(/* && /* ? /* || */ : */ ! */)');
      expect(scanner.next().type, equals(TokenType.leftParen));
      expect(scanner.next().type, equals(TokenType.rightParen));
      expect(scanner.next().type, equals(TokenType.endOfFile));
    });

    test("Dart's notion of whitespace", () {
      var scanner = Scanner('( \t \n)');
      expect(scanner.next().type, equals(TokenType.leftParen));
      expect(scanner.next().type, equals(TokenType.rightParen));
      expect(scanner.next().type, equals(TokenType.endOfFile));
    });
  });

  group('disallows', () {
    test('a single |', () {
      expect(() => _scan('|'), throwsFormatException);
    });

    test('"| |"', () {
      expect(() => _scan('| |'), throwsFormatException);
    });

    test('a single &', () {
      expect(() => _scan('&'), throwsFormatException);
    });

    test('"& &"', () {
      expect(() => _scan('& &'), throwsFormatException);
    });

    test('an unknown operator', () {
      expect(() => _scan('=='), throwsFormatException);
    });

    test('unicode', () {
      expect(() => _scan('öh'), throwsFormatException);
    });

    test('an unclosed multi-line comment', () {
      expect(() => _scan('/*'), throwsFormatException);
    });

    test('an unopened multi-line comment', () {
      expect(() => _scan('*/'), throwsFormatException);
    });
  });
}

/// Asserts that the first token scanned from [selector] has type [type],
/// and that that token's span is exactly [selector].
void _expectSimpleScan(String selector, TokenType type) {
  // Complicate the selector to test that the span covers it correctly.
  var token = _scan('   $selector  ');
  expect(token.type, equals(type));
  expect(token.span.text, equals(selector));
  expect(token.span.start.offset, equals(3));
  expect(token.span.end.offset, equals(3 + selector.length));
}

/// Scans a single token from [selector].
dynamic _scan(String selector) => Scanner(selector).next();
