// 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/boolean_selector.dart';

void main() {
  group('toString() for', () {
    test('a variable is its name', () {
      _expectToString('foo');
      _expectToString('a-b');
    });

    group('not', () {
      test("doesn't parenthesize a variable", () => _expectToString('!a'));
      test("doesn't parenthesize a nested not", () => _expectToString('!!a'));
      test('parenthesizes an or', () => _expectToString('!(a || b)'));
      test('parenthesizes an and', () => _expectToString('!(a && b)'));
      test('parenthesizes a condition', () => _expectToString('!(a ? b : c)'));
    });

    group('or', () {
      test("doesn't parenthesize variables", () => _expectToString('a || b'));
      test("doesn't parenthesize nots", () => _expectToString('!a || !b'));

      test("doesn't parenthesize ors", () {
        _expectToString('a || b || c || d');
        _expectToString('((a || b) || c) || d', 'a || b || c || d');
      });

      test('parenthesizes ands',
          () => _expectToString('a && b || c && d', '(a && b) || (c && d)'));

      test('parenthesizes conditions',
          () => _expectToString('(a ? b : c) || (e ? f : g)'));
    });

    group('and', () {
      test("doesn't parenthesize variables", () => _expectToString('a && b'));
      test("doesn't parenthesize nots", () => _expectToString('!a && !b'));

      test(
          'parenthesizes ors',
          () =>
              _expectToString('(a || b) && (c || d)', '(a || b) && (c || d)'));

      test("doesn't parenthesize ands", () {
        _expectToString('a && b && c && d');
        _expectToString('((a && b) && c) && d', 'a && b && c && d');
      });

      test('parenthesizes conditions',
          () => _expectToString('(a ? b : c) && (e ? f : g)'));
    });

    group('conditional', () {
      test(
          "doesn't parenthesize variables", () => _expectToString('a ? b : c'));

      test("doesn't parenthesize nots", () => _expectToString('!a ? !b : !c'));

      test("doesn't parenthesize ors",
          () => _expectToString('a || b ? c || d : e || f'));

      test("doesn't parenthesize ands",
          () => _expectToString('a && b ? c && d : e && f'));

      test('parenthesizes non-trailing conditions', () {
        _expectToString('(a ? b : c) ? (e ? f : g) : h ? i : j');
        _expectToString('(a ? b : c) ? (e ? f : g) : (h ? i : j)',
            '(a ? b : c) ? (e ? f : g) : h ? i : j');
      });
    });
  });
}

void _expectToString(String selector, [String result]) {
  result ??= selector;
  expect(_toString(selector), equals(result),
      reason: 'Expected toString of "$selector" to be "$result".');
}

String _toString(String selector) => BooleanSelector.parse(selector).toString();
