/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.
 */

package com.facebook.buck.cli;

import static org.junit.Assert.assertEquals;

import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;

import org.ini4j.Ini;
import org.ini4j.InvalidFileFormatException;
import org.ini4j.Profile.Section;
import org.junit.Test;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

/**
 * Unit test to verify expectations about how the API for {@link Ini} works, as many of its methods
 * lack proper Javadoc.
 */
public class IniTest {

  @Test
  public void testSecondaryLoadOverridesOriginalDefs()
      throws InvalidFileFormatException, IOException {
    Ini ini = new Ini();
    Reader originalInput = new StringReader(Joiner.on("\n").join(
        "[alias]",
        "  buck = //src/com/facebook/buck/cli:cli",
        "[cache]",
        "  mode = dir"));
    Reader overrideInput = new StringReader(Joiner.on("\n").join(
        "[alias]",
        "  test_util = //test/com/facebook/buck/util:util",
        "[cache]",
        "  mode ="));
    ini.load(originalInput);
    ini.load(overrideInput);

    Section aliasSection = ini.get("alias");
    assertEquals(
        "Should be the union of the two [alias] sections.",
        ImmutableMap.of(
            "buck", "//src/com/facebook/buck/cli:cli",
            "test_util", "//test/com/facebook/buck/util:util"),
        aliasSection);

    Section cacheSection = ini.get("cache");
    assertEquals(
        "Values from overrideInput should supercede those from originalInput, as appropriate.",
        ImmutableMap.of("mode", ""),
        cacheSection);
  }
}
