/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.collect.io;
import static com.opengamma.strata.collect.TestHelper.assertThrows;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static org.testng.Assert.assertEquals;
import java.io.File;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import com.google.common.io.CharSource;
import com.google.common.io.Files;
/**
* Test {@link IniFile}.
*/
@Test
public class IniFileTest {
private final String INI1 = "" +
"# comment\n" +
"[section]\n" +
"c = x\n" +
"b = y\n" +
"a = z\n" +
"\n" +
"; comment\n" +
"[name]\n" +
"a = m\n" +
"b = n\n";
private final String INI2 = "" +
"[section]\n" +
"a = x\n" +
"b = y\n";
private final String INI3 = "" +
"[section]\n" +
"a = x\n" +
"a = y\n";
public void test_of_noLists() {
IniFile test = IniFile.of(CharSource.wrap(INI1));
Multimap<String, String> keyValues1 = ImmutableListMultimap.of("c", "x", "b", "y", "a", "z");
Multimap<String, String> keyValues2 = ImmutableListMultimap.of("a", "m", "b", "n");
assertEquals(
test.asMap(),
ImmutableMap.of("section", PropertySet.of(keyValues1), "name", PropertySet.of(keyValues2)));
assertEquals(test.contains("section"), true);
assertEquals(test.section("section"), PropertySet.of(keyValues1));
assertEquals(test.section("section").contains("c"), true);
assertEquals(test.section("section").value("c"), "x");
assertEquals(test.section("section").valueList("c"), ImmutableList.of("x"));
assertEquals(test.section("section").contains("b"), true);
assertEquals(test.section("section").value("b"), "y");
assertEquals(test.section("section").valueList("b"), ImmutableList.of("y"));
assertEquals(test.section("section").contains("a"), true);
assertEquals(test.section("section").value("a"), "z");
assertEquals(test.section("section").valueList("a"), ImmutableList.of("z"));
assertEquals(test.section("section").contains("d"), false);
// order must be retained
assertEquals(ImmutableList.copyOf(test.section("section").keys()), ImmutableList.of("c", "b", "a"));
assertEquals(test.section("section").asMultimap(), ImmutableListMultimap.of("c", "x", "b", "y", "a", "z"));
assertEquals(test.contains("name"), true);
assertEquals(test.section("name"), PropertySet.of(keyValues2));
assertEquals(test.section("name").contains("a"), true);
assertEquals(test.section("name").value("a"), "m");
assertEquals(test.section("name").valueList("a"), ImmutableList.of("m"));
assertEquals(test.section("name").contains("b"), true);
assertEquals(test.section("name").value("b"), "n");
assertEquals(test.section("name").valueList("b"), ImmutableList.of("n"));
assertEquals(test.section("name").contains("c"), false);
assertEquals(ImmutableList.copyOf(test.section("name").keys()), ImmutableList.of("a", "b"));
assertEquals(test.section("name").asMultimap(), ImmutableListMultimap.of("a", "m", "b", "n"));
assertEquals(test.contains("unknown"), false);
assertThrowsIllegalArg(() -> test.section("unknown"));
assertEquals(test.section("section").valueList("unknown"), ImmutableList.of());
assertThrowsIllegalArg(() -> test.section("section").value("unknown"));
assertEquals(test.toString(), "{section={c=[x], b=[y], a=[z]}, name={a=[m], b=[n]}}");
}
public void test_of_list() {
IniFile test = IniFile.of(CharSource.wrap(INI3));
Multimap<String, String> keyValues1 = ImmutableListMultimap.of("a", "x", "a", "y");
assertEquals(test.asMap(), ImmutableMap.of("section", PropertySet.of(keyValues1)));
assertEquals(test.section("section"), PropertySet.of(keyValues1));
assertEquals(test.section("section").contains("a"), true);
assertThrowsIllegalArg(() -> test.section("section").value("a"));
assertEquals(test.section("section").valueList("a"), ImmutableList.of("x", "y"));
assertEquals(test.section("section").contains("b"), false);
assertEquals(test.section("section").keys(), ImmutableSet.of("a"));
assertEquals(test.section("section").asMultimap(), ImmutableListMultimap.of("a", "x", "a", "y"));
assertEquals(test.toString(), "{section={a=[x, y]}}");
}
public void test_of_propertyNoEquals() {
IniFile test = IniFile.of(CharSource.wrap("[section]\na\n"));
Multimap<String, String> keyValues1 = ImmutableListMultimap.of("a", "");
assertEquals(test.asMap(), ImmutableMap.of("section", PropertySet.of(keyValues1)));
assertEquals(test.section("section"), PropertySet.of(keyValues1));
assertEquals(test.section("section").contains("a"), true);
assertEquals(test.section("section").valueList("a"), ImmutableList.of(""));
assertEquals(test.section("section").contains("b"), false);
assertEquals(test.section("section").keys(), ImmutableSet.of("a"));
assertEquals(test.section("section").asMultimap(), ImmutableListMultimap.of("a", ""));
assertEquals(test.toString(), "{section={a=[]}}");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void test_of_invalid_propertyAtStart() {
String invalid =
"a = x\n";
IniFile.of(CharSource.wrap(invalid));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void test_of_invalid_badSection() {
String invalid = "" +
"[section\n" +
"b\n";
IniFile.of(CharSource.wrap(invalid));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void test_of_invalid_duplicateSection() {
String invalid = "" +
"[section]\n" +
"a = y\n" +
"[section]\n" +
"b = y\n";
IniFile.of(CharSource.wrap(invalid));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void test_of_invalid_emptyKey() {
String invalid = "" +
"[section]\n" +
"= y\n";
IniFile.of(CharSource.wrap(invalid));
}
public void test_of_ioException() {
assertThrows(
() -> IniFile.of(Files.asCharSource(new File("src/test/resources"), StandardCharsets.UTF_8)),
UncheckedIOException.class);
}
//-------------------------------------------------------------------------
public void test_equalsHashCode() {
IniFile a1 = IniFile.of(CharSource.wrap(INI1));
IniFile a2 = IniFile.of(CharSource.wrap(INI1));
IniFile b = IniFile.of(CharSource.wrap(INI2));
assertEquals(a1.equals(a1), true);
assertEquals(a1.equals(a2), true);
assertEquals(a1.equals(b), false);
assertEquals(a1.equals(null), false);
assertEquals(a1.equals(""), false);
assertEquals(a1.hashCode(), a2.hashCode());
}
public void test_equalsHashCode_section() {
IniFile a1 = IniFile.of(CharSource.wrap(INI1));
IniFile a2 = IniFile.of(CharSource.wrap(INI1));
IniFile b = IniFile.of(CharSource.wrap(INI2));
assertEquals(a1.section("name").equals(a1.section("name")), true);
assertEquals(a1.section("name").equals(a2.section("name")), true);
assertEquals(a1.section("name").equals(b.section("section")), false);
assertEquals(a1.section("name").equals(null), false);
assertEquals(a1.section("name").equals(""), false);
assertEquals(a1.section("name").hashCode(), a2.section("name").hashCode());
}
}