001/*
002 * Copyright 2020 Global Biodiversity Information Facility (GBIF)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.gbif.api.vocabulary;
017
018import java.util.Locale;
019
020import org.junit.jupiter.api.Test;
021
022import com.fasterxml.jackson.databind.ObjectMapper;
023
024import static org.junit.jupiter.api.Assertions.assertEquals;
025import static org.junit.jupiter.api.Assertions.assertNotNull;
026import static org.junit.jupiter.api.Assertions.assertTrue;
027import static org.junit.jupiter.api.Assertions.fail;
028
029public class LanguageTest {
030
031  @Test
032  public void testFromIsoCode() {
033    assertEquals(Language.ENGLISH, Language.fromIsoCode("en"));
034    assertEquals(Language.ESTONIAN, Language.fromIsoCode("et"));
035    assertEquals(Language.ZULU, Language.fromIsoCode("ZU"));
036    assertEquals(Language.GERMAN, Language.fromIsoCode("de"));
037    assertEquals(Language.GERMAN, Language.fromIsoCode("DEU"));
038    assertEquals(Language.GERMAN, Language.fromIsoCode("Deu"));
039  }
040
041  @Test
042  public void testGetIso2LetterCode() {
043    for (Language l : Language.values()) {
044      assertNotNull(l.getIso2LetterCode());
045      // make sure its lower case
046      assertEquals(l.getIso2LetterCode().toLowerCase(), l.getIso2LetterCode());
047    }
048    assertEquals("en", Language.ENGLISH.getIso2LetterCode());
049    assertEquals("de", Language.GERMAN.getIso2LetterCode());
050    assertEquals("", Language.UNKNOWN.getIso2LetterCode());
051  }
052
053  @Test
054  public void testGetIso3LetterCode() {
055    for (Language l : Language.values()) {
056      assertNotNull(l.getIso3LetterCode());
057      // make sure its lower case
058      assertEquals(l.getIso3LetterCode().toLowerCase(), l.getIso3LetterCode());
059    }
060    assertEquals("eng", Language.ENGLISH.getIso3LetterCode());
061    assertEquals("deu", Language.GERMAN.getIso3LetterCode());
062    assertEquals("", Language.UNKNOWN.getIso3LetterCode());
063  }
064
065  @Test
066  public void testGetLocale() {
067    for (Language l : Language.values()) {
068      assertNotNull(l);
069      assertNotNull(l.getLocale());
070    }
071    assertEquals(Locale.ENGLISH, Language.ENGLISH.getLocale());
072    assertEquals(Locale.GERMAN, Language.GERMAN.getLocale());
073    assertEquals(Locale.ROOT, Language.UNKNOWN.getLocale());
074  }
075
076  @Test
077  public void testGetTitleEnglish() {
078    for (Language l : Language.values()) {
079      assertNotNull(l.getTitleEnglish());
080    }
081    assertEquals("English", Language.ENGLISH.getTitleEnglish());
082    assertEquals("German", Language.GERMAN.getTitleEnglish());
083    assertEquals("", Language.UNKNOWN.getTitleEnglish());
084  }
085
086  @Test
087  public void testGetTitleNative() {
088    for (Language l : Language.values()) {
089      assertNotNull(l.getTitleNative());
090    }
091    assertEquals("English", Language.ENGLISH.getTitleNative());
092    assertEquals("Deutsch", Language.GERMAN.getTitleNative());
093    assertEquals("", Language.UNKNOWN.getTitleNative());
094  }
095
096  /**
097   * A container of Languages using 2 properties.
098   */
099  private static class Container {
100
101    public Language language;
102    public Language island; // verify that the names don't matter
103
104    public Container(Language language, Language island) {
105      this.language = language;
106      this.island = island;
107    }
108
109    // used by serializer below
110    public Container() {
111    }
112  }
113
114  @Test
115  public void testSerDe() {
116    ObjectMapper mapper = new ObjectMapper();
117    Container source = new Container(Language.DANISH, Language.SUNDANESE);
118    try {
119      String json = mapper.writeValueAsString(source);
120      assertTrue(json.equals(json.toLowerCase()), "Only lower case letters allowed for language iso codes");
121      assertEquals(33, json.length());
122      Container target = mapper.readValue(json, Container.class);
123      assertEquals(source.language, target.language, "language differs");
124      assertEquals(source.island, target.island, "island differs");
125    } catch (Exception e) {
126      fail(e.getMessage());
127    }
128  }
129
130  /**
131   * Ensure the decision to use iso 3 codes is as backwards compatible as possible.
132   */
133  @Test
134  public void testSerDeBackwardsCompatible() {
135    try {
136      assertEquals(Language.PORTUGUESE, Language.LenientDeserializer.lenientParse("pt"));
137      assertEquals(Language.PORTUGUESE, Language.LenientDeserializer.lenientParse("PT"));
138      assertEquals(Language.PORTUGUESE, Language.LenientDeserializer.lenientParse("POR"));
139      assertEquals(Language.PORTUGUESE, Language.LenientDeserializer.lenientParse("por"));
140      assertEquals(Language.PORTUGUESE, Language.LenientDeserializer.lenientParse("PORTUGUESE"));
141    } catch (Exception e) {
142      fail(e.getMessage());
143    }
144  }
145}