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


library bidi_utils_test;

import 'package:intl/intl.dart';
import 'package:unittest/unittest.dart';

/**
 * Tests the bidi utilities library.
 */
main() {
  var LRE = '\u202A';
  var RLE = '\u202B';
  var PDF = '\u202C';
  var LRM = '\u200E';
  var RLM = '\u200F';

  test('isRtlLang', () {
    expect(Bidi.isRtlLanguage('en'), isFalse);
    expect(Bidi.isRtlLanguage('fr'), isFalse);
    expect(Bidi.isRtlLanguage('zh-CN'), isFalse);
    expect(Bidi.isRtlLanguage('fil'), isFalse);
    expect(Bidi.isRtlLanguage('az'), isFalse);
    expect(Bidi.isRtlLanguage('iw-Latn'), isFalse);
    expect(Bidi.isRtlLanguage('iw-LATN'), isFalse);
    expect(Bidi.isRtlLanguage('iw_latn'), isFalse);
    expect(Bidi.isRtlLanguage('ar'), isTrue);
    expect(Bidi.isRtlLanguage('AR'), isTrue);
    expect(Bidi.isRtlLanguage('iw'), isTrue);
    expect(Bidi.isRtlLanguage('he'), isTrue);
    expect(Bidi.isRtlLanguage('fa'), isTrue);
    expect(Bidi.isRtlLanguage('ar-EG'), isTrue);
    expect(Bidi.isRtlLanguage('az-Arab'), isTrue);
    expect(Bidi.isRtlLanguage('az-ARAB-IR'), isTrue);
    expect(Bidi.isRtlLanguage('az_arab_IR'), isTrue);
  });

  test('hasAnyLtr', () {
    expect(Bidi.hasAnyLtr(''), isFalse);
    expect(Bidi.hasAnyLtr('\u05e0\u05e1\u05e2'), isFalse);
    expect(Bidi.hasAnyLtr('\u05e0\u05e1z\u05e2'), isTrue);
    expect(Bidi.hasAnyLtr('123\t...  \n'), isFalse);
    expect(Bidi.hasAnyLtr('<br>123&lt;', false), isTrue);
    expect(Bidi.hasAnyLtr('<br>123&lt;', true), isFalse);
  });

  test('hasAnyRtl', () {
    expect(Bidi.hasAnyRtl(''), isFalse);
    expect(Bidi.hasAnyRtl('abc'), isFalse);
    expect(Bidi.hasAnyRtl('ab\u05e0c'), isTrue);
    expect(Bidi.hasAnyRtl('123\t...  \n'), isFalse);
    expect(Bidi.hasAnyRtl('<input value=\u05e0>123', false), isTrue);
    expect(Bidi.hasAnyRtl('<input value=\u05e0>123', true), isFalse);
  });


  test('endsWithLtr', () {
    expect(Bidi.endsWithLtr('a'), isTrue);
    expect(Bidi.endsWithLtr('abc'), isTrue);
    expect(Bidi.endsWithLtr('a (!)'), isTrue);
    expect(Bidi.endsWithLtr('a.1'), isTrue);
    expect(Bidi.endsWithLtr('http://www.google.com '), isTrue);
    expect(Bidi.endsWithLtr('\u05e0a'), isTrue);
    expect(Bidi.endsWithLtr(' \u05e0\u05e1a\u05e2\u05e3 a (!)'), isTrue);
    expect(Bidi.endsWithLtr(''), isFalse);
    expect(Bidi.endsWithLtr(' '), isFalse);
    expect(Bidi.endsWithLtr('1'), isFalse);
    expect(Bidi.endsWithLtr('\u05e0'), isFalse);
    expect(Bidi.endsWithLtr('\u05e0 1(!)'), isFalse);
    expect(Bidi.endsWithLtr('a\u05e0'), isFalse);
    expect(Bidi.endsWithLtr('a abc\u05e0\u05e1def\u05e2. 1'), isFalse);
    expect(Bidi.endsWithLtr(' \u05e0\u05e1a\u05e2 &lt;', true), isFalse);
    expect(Bidi.endsWithLtr(' \u05e0\u05e1a\u05e2 &lt;', false), isTrue);
  });

  test('endsWithRtl', () {
    expect(Bidi.endsWithRtl('\u05e0'), isTrue);
    expect(Bidi.endsWithRtl('\u05e0\u05e1\u05e2'), isTrue);
    expect(Bidi.endsWithRtl('\u05e0 (!)'), isTrue);
    expect(Bidi.endsWithRtl('\u05e0.1'), isTrue);
    expect(Bidi.endsWithRtl('http://www.google.com/\u05e0 '), isTrue);
    expect(Bidi.endsWithRtl('a\u05e0'), isTrue);
    expect(Bidi.endsWithRtl(' a abc\u05e0def\u05e3. 1'), isTrue);
    expect(Bidi.endsWithRtl(''), isFalse);
    expect(Bidi.endsWithRtl(' '), isFalse);
    expect(Bidi.endsWithRtl('1'), isFalse);
    expect(Bidi.endsWithRtl('a'), isFalse);
    expect(Bidi.endsWithRtl('a 1(!)'), isFalse);
    expect(Bidi.endsWithRtl('\u05e0a'), isFalse);
    expect(Bidi.endsWithRtl('\u05e0 \u05e0\u05e1ab\u05e2 a (!)'), isFalse);
    expect(Bidi.endsWithRtl(' \u05e0\u05e1a\u05e2 &lt;', true), isTrue);
    expect(Bidi.endsWithRtl(' \u05e0\u05e1a\u05e2 &lt;', false), isFalse);
  });

  test('guardBracketInHtml', () {
    var strWithRtl = "asc \u05d0 (\u05d0\u05d0\u05d0)";
    expect(Bidi.guardBracketInHtml(strWithRtl),
        equals("asc \u05d0 <span dir=rtl>(\u05d0\u05d0\u05d0)</span>"));
    expect(Bidi.guardBracketInHtml(strWithRtl, true),
        equals("asc \u05d0 <span dir=rtl>(\u05d0\u05d0\u05d0)</span>"));
    expect(Bidi.guardBracketInHtml(strWithRtl, false),
        equals("asc \u05d0 <span dir=ltr>(\u05d0\u05d0\u05d0)</span>"));

    var strWithRtl2 = "\u05d0 a (asc:))";
    expect(Bidi.guardBracketInHtml(strWithRtl2),
        equals("\u05d0 a <span dir=rtl>(asc:))</span>"));
    expect(Bidi.guardBracketInHtml(strWithRtl2, true),
        equals("\u05d0 a <span dir=rtl>(asc:))</span>"));
    expect(Bidi.guardBracketInHtml(strWithRtl2, false),
        equals("\u05d0 a <span dir=ltr>(asc:))</span>"));

    var strWithoutRtl = "a (asc) {{123}}";
    expect(Bidi.guardBracketInHtml(strWithoutRtl),
        equals("a <span dir=ltr>(asc)</span> <span dir=ltr>{{123}}</span>"));
    expect(Bidi.guardBracketInHtml(strWithoutRtl, true),
        equals("a <span dir=rtl>(asc)</span> <span dir=rtl>{{123}}</span>"));
    expect(Bidi.guardBracketInHtml(strWithoutRtl, false),
        equals("a <span dir=ltr>(asc)</span> <span dir=ltr>{{123}}</span>"));

  });

  test('guardBracketInText', () {
    var strWithRtl = "asc \u05d0 (\u05d0\u05d0\u05d0)";
    expect(Bidi.guardBracketInText(strWithRtl),
        equals("asc \u05d0 \u200f(\u05d0\u05d0\u05d0)\u200f"));
    expect(Bidi.guardBracketInText(strWithRtl, true),
        equals("asc \u05d0 \u200f(\u05d0\u05d0\u05d0)\u200f"));
    expect(Bidi.guardBracketInText(strWithRtl, false),
        equals("asc \u05d0 \u200e(\u05d0\u05d0\u05d0)\u200e"));

    var strWithRtl2 = "\u05d0 a (asc:))";
    expect(Bidi.guardBracketInText(strWithRtl2),
        equals("\u05d0 a \u200f(asc:))\u200f"));
    expect(Bidi.guardBracketInText(strWithRtl2, true),
        equals("\u05d0 a \u200f(asc:))\u200f"));
    expect(Bidi.guardBracketInText(strWithRtl2, false),
        equals("\u05d0 a \u200e(asc:))\u200e"));

    var strWithoutRtl = "a (asc) {{123}}";
    expect(Bidi.guardBracketInText(strWithoutRtl),
        equals("a \u200e(asc)\u200e \u200e{{123}}\u200e"));
    expect(Bidi.guardBracketInText(strWithoutRtl, true),
        equals("a \u200f(asc)\u200f \u200f{{123}}\u200f"));
    expect(Bidi.guardBracketInText(strWithoutRtl, false),
        equals("a \u200e(asc)\u200e \u200e{{123}}\u200e"));

  });

  test('enforceRtlInHtml', () {
    var str = '<div> first <br> second </div>';
    expect(Bidi.enforceRtlInHtml(str),
        equals('<div dir=rtl> first <br> second </div>'));
    str = 'first second';
    expect(Bidi.enforceRtlInHtml(str),
        equals('\n<span dir=rtl>first second</span>'));
  });

  test('enforceRtlInText', () {
    var str = 'first second';
    expect(Bidi.enforceRtlInText(str), equals('${RLE}first second$PDF'));
  });

  test('enforceLtrInHtml', () {
    var str = '<div> first <br> second </div>';
    expect(Bidi.enforceLtrInHtml(str),
        equals('<div dir=ltr> first <br> second </div>'));
    str = 'first second';
    expect(Bidi.enforceLtrInHtml(str),
        equals('\n<span dir=ltr>first second</span>'));
  });

  test('enforceLtrInText', () {
    var str = 'first second';
    expect(Bidi.enforceLtrInText(str), equals('${LRE}first second$PDF'));
  });

  test('normalizeHebrewQuote', () {
    expect(Bidi.normalizeHebrewQuote('\u05d0"'), equals('\u05d0\u05f4'));
    expect(Bidi.normalizeHebrewQuote('\u05d0\''), equals('\u05d0\u05f3'));
    expect(Bidi.normalizeHebrewQuote('\u05d0"\u05d0\''),
        equals('\u05d0\u05f4\u05d0\u05f3'));
  });

  test('estimateDirectionOfText', () {
    expect(Bidi.estimateDirectionOfText('', isHtml: false).value,
        equals(TextDirection.UNKNOWN.value));
    expect(Bidi.estimateDirectionOfText(' ', isHtml: false).value,
        equals(TextDirection.UNKNOWN.value));
    expect(Bidi.estimateDirectionOfText('! (...)', isHtml: false).value,
        equals(TextDirection.UNKNOWN.value));
    expect(Bidi.estimateDirectionOfText('All-Ascii content',
                                        isHtml: false).value,
        equals(TextDirection.LTR.value));
    expect(Bidi.estimateDirectionOfText('-17.0%', isHtml: false).value,
        equals(TextDirection.LTR.value));
    expect(Bidi.estimateDirectionOfText('http://foo/bar/', isHtml: false).value,
        equals(TextDirection.LTR.value));
    expect(Bidi.estimateDirectionOfText(
        'http://foo/bar/?s=\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
        '\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
        '\u05d0\u05d0\u05d0\u05d0\u05d0').value,
        equals(TextDirection.LTR.value));
    expect(Bidi.estimateDirectionOfText('\u05d0', isHtml: false).value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        '9 \u05d0 -> 17.5, 23, 45, 19', isHtml: false).value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        'http://foo/bar/ \u05d0 http://foo2/bar2/ http://foo3/bar3/').value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        '\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0'
        '\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4'
        '\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9'
        '\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, \u05d4\u05d9\u05d4 \u05e9'
        '\u05dd').value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        '\u05db\u05d0 - http://geek.co.il/gallery/v/2007-06 - \u05d0\u05d9'
        '\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0\u05d5\u05ea:'
        ' \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1 '
        '\u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9\u05d9 \u05de\u05e6'
        '\u05dc\u05dd, \u05d4\u05d9\u05d4 \u05e9\u05dd \u05d1\u05e2\u05d9\u05e7'
        ' \u05d4\u05e8\u05d1\u05d4 \u05d0\u05e0\u05e9\u05d9\u05dd. \u05de\u05d4'
        ' \u05e9\u05db\u05df - \u05d0\u05e4\u05e9\u05e8 \u05dc\u05e0\u05e6'
        '\u05dc \u05d0\u05ea \u05d4\u05d4 \u05d3\u05d6\u05de\u05e0\u05d5 '
        '\u05dc\u05d4\u05e1\u05ea\u05db\u05dc \u05e2\u05dc \u05db\u05de\u05d4 '
        '\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05de\u05e9\u05e9\u05e2\u05d5'
        '\u05ea \u05d9\u05e9\u05e0\u05d5 \u05d9\u05d5\u05ea\u05e8 \u05e9\u05d9'
        '\u05e9 \u05dc\u05d9 \u05d1\u05d0\u05ea\u05e8', isHtml: false).value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        'CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
        '\u05de\u05d3\u05d9?').value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        'Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. \u05e9\u05d0\u05dc'
        '\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0\u05e0\u05d9 '
        '\u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 \u05dc\u05d7'
        '\u05d2').value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        '17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc\u05d0 \u05d4\u05d9'
        '\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.').value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        '5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4\u05e0\u05e9\u05d9'
        '\u05e7\u05d4', isHtml: false).value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        '\u05d4\u05d3\u05dc\u05ea http://www.google.com '
        'http://www.gmail.com').value,
        equals(TextDirection.RTL.value));
    expect(Bidi.estimateDirectionOfText(
        '\u05d4\u05d3\u05dc <some quite nasty html mark up>').value,
        equals(TextDirection.LTR.value));
    expect(Bidi.estimateDirectionOfText(
        '\u05d4\u05d3\u05dc <some quite nasty html mark up>').value,
        equals(TextDirection.LTR.value));
    expect(Bidi.estimateDirectionOfText(
        '\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;').value,
        equals(TextDirection.LTR.value));
    expect(Bidi.estimateDirectionOfText(
        '\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;', isHtml: true).value,
        equals(TextDirection.RTL.value));
  });

  test('detectRtlDirectionality', () {
    var bidiText = [];
    var item = new SampleItem('Pure Ascii content');
    bidiText.add(item);

    item = new SampleItem('\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4'
        ' \u05dc\u05e8\u05d0\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc'
        '\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd '
        '\u05d0\u05dd \u05d4\u05d9\u05d9\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, '
        '\u05d4\u05d9\u05d4 \u05e9\u05dd', true);
    bidiText.add(item);

    item = new SampleItem('\u05db\u05d0\u05df - http://geek.co.il/gallery/v/'
        '2007-06 - \u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc'
        '\u05e8\u05d0\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea'
        '\u05d9 \u05d4\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd \u05d0\u05dd \u05d4'
        '\u05d9\u05d9\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, \u05d4\u05d9\u05d4 '
        '\u05e9\u05dd \u05d1\u05e2\u05d9\u05e7\u05e8 \u05d4\u05e8\u05d1\u05d4 '
        '\u05d0\u05e0\u05e9\u05d9\u05dd. \u05de\u05d4 \u05e9\u05db\u05df - '
        '\u05d0\u05e4\u05e9\u05e8 \u05dc\u05e0\u05e6\u05dc \u05d0\u05ea \u05d4'
        '\u05d4\u05d3\u05d6\u05de\u05e0\u05d5\u05ea \u05dc\u05d4\u05e1\u05ea'
        '\u05db\u05dc \u05e2\u05dc \u05db\u05de\u05d4 \u05ea\u05de\u05d5\u05e0'
        '\u05d5\u05ea \u05de\u05e9\u05e2\u05e9\u05e2\u05d5\u05ea \u05d9\u05e9'
        '\u05e0\u05d5\u05ea \u05d9\u05d5\u05ea\u05e8 \u05e9\u05d9\u05e9 \u05dc'
        '\u05d9 \u05d1\u05d0\u05ea\u05e8', true);
    bidiText.add(item);

    item = new SampleItem('CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
        '\u05de\u05d3\u05d9?', true);
    bidiText.add(item);


    item = new SampleItem('Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. '
        '\u05e9\u05d0\u05dc\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0'
        '\u05e0\u05d9 \u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 '
        '\u05dc\u05d7\u05d2', true);
    bidiText.add(item);

    item = new SampleItem('17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc'
        '\u05d0 \u05d4\u05d9\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.', true);
    bidiText.add(item);

    item = new SampleItem('5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4'
        '\u05e0\u05e9\u05d9\u05e7\u05d4', true);
    bidiText.add(item);

    item = new SampleItem('\u05d4\u05d3\u05dc\u05ea http://www.google.com '
        'http://www.gmail.com', true);
    bidiText.add(item);

    item = new SampleItem('&gt;\u05d4&lt;', true, true);
    bidiText.add(item);

    item = new SampleItem('&gt;\u05d4&lt;', false);
    bidiText.add(item);

    for (var i = 0; i < bidiText.length; i++) {
        var isRtlDir = Bidi.detectRtlDirectionality(bidiText[i].text,
                                                    isHtml: bidiText[i].isHtml);
      if (isRtlDir != bidiText[i].isRtl) {
        var str = '"${bidiText[i].text} " should be '
                  '${bidiText[i].isRtl ? "rtl" : "ltr"} but detected as '
                  '${isRtlDir ? "rtl" : "ltr"}';
        //alert(str);
      }
      expect(bidiText[i].isRtl, isRtlDir);
    }
  });
}

class SampleItem {
  String text;
  bool isRtl;
  bool isHtml;
  SampleItem([someText='', someIsRtl=false, isHtml=false]) :
      this.text=someText, this.isRtl=someIsRtl, this.isHtml=isHtml;
}
