/*
 ****************************************************************************************
 * Copyright (C) 2009, Google, Inc.; International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                         *
 ****************************************************************************************
 */

package com.ibm.icu.dev.test.util;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.util.ULocale;
import com.ibm.icu.util.LocaleMatcher;
import com.ibm.icu.util.LocalePriorityList;

/**
 * Test the LanguageMatcher.
 * 
 * @author markdavis
 */
public class LocaleMatcherTest extends TestFmwk {
    
    public static void main(String[] args) throws Exception {
        new LocaleMatcherTest().run(args);
      }

  public void testBasics() {
    final LocaleMatcher matcher = new LocaleMatcher(LocalePriorityList
        .add(ULocale.FRENCH).add(ULocale.UK)
        .add(ULocale.ENGLISH).build());
    logln(matcher.toString());

    assertEquals(ULocale.UK, matcher.getBestMatch(ULocale.UK));
    assertEquals(ULocale.ENGLISH, matcher.getBestMatch(ULocale.US));
    assertEquals(ULocale.FRENCH, matcher.getBestMatch(ULocale.FRANCE));
    assertEquals(ULocale.FRENCH, matcher.getBestMatch(ULocale.JAPAN));
  }

  public void testFallback() {
    // check that script fallbacks are handled right
    final LocaleMatcher matcher = new LocaleMatcher("zh_CN, zh_TW, iw");
    assertEquals(new ULocale("zh_TW"), matcher.getBestMatch("zh_Hant"));
    assertEquals(new ULocale("zh_CN"), matcher.getBestMatch("zh"));
    assertEquals(new ULocale("zh_CN"), matcher.getBestMatch("zh_Hans_CN"));
    assertEquals(new ULocale("zh_TW"), matcher.getBestMatch("zh_Hant_HK"));
    assertEquals(new ULocale("he"), matcher.getBestMatch("iw_IT"));
  }

  public void testSpecials() {
    // check that nearby languages are handled
    final LocaleMatcher matcher = new LocaleMatcher("en, fil, ro, nn");
    assertEquals(new ULocale("fil"), matcher.getBestMatch("tl"));
    assertEquals(new ULocale("ro"), matcher.getBestMatch("mo"));
    assertEquals(new ULocale("nn"), matcher.getBestMatch("nb"));
    // make sure default works
    assertEquals(new ULocale("en"), matcher.getBestMatch("ja"));
  }

  public void testRegionalSpecials() {
    // verify that en_AU is closer to en_GB than to en (which is en_US)
    final LocaleMatcher matcher = new LocaleMatcher("en, en_GB, es, es_419");
    assertEquals("en_AU in {en, en_GB, es, es_419}", new ULocale("en_GB"), matcher.getBestMatch("en_AU"));
    assertEquals("es_MX in {en, en_GB, es, es_419}", new ULocale("es_419"), matcher.getBestMatch("es_MX"));
    assertEquals("es_ES in {en, en_GB, es, es_419}", new ULocale("es"), matcher.getBestMatch("es_ES"));
  }
  
  private void assertEquals(Object expected, Object string) {
      assertEquals("", expected, string);
  }

}
