// Copyright 2008 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

goog.provide('goog.structs.InversionMapTest');
goog.setTestOnly('goog.structs.InversionMapTest');

goog.require('goog.structs.InversionMap');
goog.require('goog.testing.jsunit');

function testInversionWithDelta() {
  var alphabetNames = new goog.structs.InversionMap(
      [0, 97, 1, 1, 1, 20, 1, 1, 1],
      [null,
        'LATIN SMALL LETTER A',
        'LATIN SMALL LETTER B',
        'LATIN SMALL LETTER C',
        null,
        'LATIN SMALL LETTER X',
        'LATIN SMALL LETTER Y',
        'LATIN SMALL LETTER Z',
        null],
      true);

  assertEquals('LATIN SMALL LETTER A', alphabetNames.at(97));
  assertEquals('LATIN SMALL LETTER Y', alphabetNames.at(121));
  assertEquals(null, alphabetNames.at(140));
  assertEquals(null, alphabetNames.at(0));
}

function testInversionWithoutDelta() {
  var alphabetNames = new goog.structs.InversionMap(
      [0, 97, 98, 99, 100, 120, 121, 122, 123],
      [null,
        'LATIN SMALL LETTER A',
        'LATIN SMALL LETTER B',
        'LATIN SMALL LETTER C',
        null,
        'LATIN SMALL LETTER X',
        'LATIN SMALL LETTER Y',
        'LATIN SMALL LETTER Z',
        null],
      false);

  assertEquals('LATIN SMALL LETTER A', alphabetNames.at(97));
  assertEquals('LATIN SMALL LETTER Y', alphabetNames.at(121));
  assertEquals(null, alphabetNames.at(140));
  assertEquals(null, alphabetNames.at(0));
}

function testInversionWithoutDeltaNoOpt() {
  var alphabetNames = new goog.structs.InversionMap(
      [0, 97, 98, 99, 100, 120, 121, 122, 123],
      [null,
        'LATIN SMALL LETTER A',
        'LATIN SMALL LETTER B',
        'LATIN SMALL LETTER C',
        null,
        'LATIN SMALL LETTER X',
        'LATIN SMALL LETTER Y',
        'LATIN SMALL LETTER Z',
        null]);

  assertEquals('LATIN SMALL LETTER A', alphabetNames.at(97));
  assertEquals('LATIN SMALL LETTER Y', alphabetNames.at(121));
  assertEquals(null, alphabetNames.at(140));
  assertEquals(null, alphabetNames.at(0));
}

function testInversionMapSplice1() {
  var alphabetNames = newAsciiMap();
  alphabetNames.spliceInversion(
      [99, 105, 114], ['XXX', 'YYY', 'ZZZ']);
  assertEquals('LATIN SMALL LETTER B', alphabetNames.at(98));
  assertEquals('XXX', alphabetNames.at(100));
  assertEquals('ZZZ', alphabetNames.at(114));
  assertEquals('ZZZ', alphabetNames.at(119));
  assertEquals('LATIN SMALL LETTER X', alphabetNames.at(120));
}

function testInversionMapSplice2() {
  var alphabetNames = newAsciiMap();
  alphabetNames.spliceInversion(
      [105, 114, 121], ['XXX', 'YYY', 'ZZZ']);
  assertEquals(null, alphabetNames.at(104));
  assertEquals('XXX', alphabetNames.at(105));
  assertEquals('YYY', alphabetNames.at(120));
  assertEquals('ZZZ', alphabetNames.at(121));
  assertEquals('LATIN SMALL LETTER Z', alphabetNames.at(122));
}

function testInversionMapSplice3() {
  var alphabetNames = newAsciiMap();
  alphabetNames.spliceInversion(
      [98, 99], ['CHANGED LETTER B', 'CHANGED LETTER C']);
  assertEquals('LATIN SMALL LETTER A', alphabetNames.at(97));
  assertEquals('CHANGED LETTER B', alphabetNames.at(98));
  assertEquals('CHANGED LETTER C', alphabetNames.at(99));
  assertEquals('LATIN SMALL LETTER D', alphabetNames.at(100));
  assertEquals(null, alphabetNames.at(101));
}

function testInversionMapSplice4() {
  var alphabetNames = newAsciiMap();
  alphabetNames.spliceInversion(
      [98, 1], ['CHANGED LETTER B', 'CHANGED LETTER C'],
      true /* delta mode */);
  assertEquals('LATIN SMALL LETTER A', alphabetNames.at(97));
  assertEquals('CHANGED LETTER B', alphabetNames.at(98));
  assertEquals('CHANGED LETTER C', alphabetNames.at(99));
  assertEquals('LATIN SMALL LETTER D', alphabetNames.at(100));
  assertEquals(null, alphabetNames.at(101));
}

function testInversionMapSplice5() {
  var map = new goog.structs.InversionMap(
      [0, 97, 98, 99],
      [null,
       'LATIN SMALL LETTER A',
       'LATIN SMALL LETTER B',
       'LATIN SMALL LETTER C']);
  map.spliceInversion(
      [98], ['CHANGED LETTER B']);
  assertEquals('LATIN SMALL LETTER A', map.at(97));
  assertEquals('CHANGED LETTER B', map.at(98));
  assertEquals('LATIN SMALL LETTER C', map.at(99));

  assertArrayEquals([0, 97, 98, 99], map.rangeArray);
}

function newAsciiMap() {
  return new goog.structs.InversionMap(
      [0, 97, 98, 99, 100, 101, 120, 121, 122, 123],
      [null,
        'LATIN SMALL LETTER A',
        'LATIN SMALL LETTER B',
        'LATIN SMALL LETTER C',
        'LATIN SMALL LETTER D',
        null,
        'LATIN SMALL LETTER X',
        'LATIN SMALL LETTER Y',
        'LATIN SMALL LETTER Z',
        null]);
}
