// Copyright (c) 2017, 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:term_glyph/term_glyph.dart' as glyph;

void main() {
  group("with ascii = false", () {
    setUpAll(() {
      glyph.ascii = false;
    });

    test("glyph getters return Unicode versions", () {
      expect(glyph.topLeftCorner, equals("┌"));
      expect(glyph.teeUpBold, equals("┻"));
      expect(glyph.longLeftArrow, equals("◀━"));
    });

    test("glyphOrAscii returns the first argument", () {
      expect(glyph.glyphOrAscii("A", "B"), equals("A"));
    });

    test("glyphs returns unicodeGlyphs", () {
      expect(glyph.glyphs, equals(glyph.unicodeGlyphs));
    });

    test("asciiGlyphs still returns ASCII characters", () {
      expect(glyph.asciiGlyphs.topLeftCorner, equals(","));
      expect(glyph.asciiGlyphs.teeUpBold, equals("+"));
      expect(glyph.asciiGlyphs.longLeftArrow, equals("<="));
    });
  });

  group("with ascii = true", () {
    setUpAll(() {
      glyph.ascii = true;
    });

    test("glyphs return ASCII versions", () {
      expect(glyph.topLeftCorner, equals(","));
      expect(glyph.teeUpBold, equals("+"));
      expect(glyph.longLeftArrow, equals("<="));
    });

    test("glyphOrAscii returns the second argument", () {
      expect(glyph.glyphOrAscii("A", "B"), equals("B"));
    });

    test("glyphs returns asciiGlyphs", () {
      expect(glyph.glyphs, equals(glyph.asciiGlyphs));
    });

    test("unicodeGlyphs still returns Unicode characters", () {
      expect(glyph.unicodeGlyphs.topLeftCorner, equals("┌"));
      expect(glyph.unicodeGlyphs.teeUpBold, equals("┻"));
      expect(glyph.unicodeGlyphs.longLeftArrow, equals("◀━"));
    });
  });
}
