/*
 * Copyright 2014-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.json;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import com.google.common.collect.ImmutableMap;

import org.junit.Test;

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

public class RawParserTest {

  @Test
  public void testParseEmptyMap() throws IOException {
    Reader reader = new StringReader("{}");
    Map<String, Object> map = RawParser.parseFromReader(reader);
    assertTrue(map.isEmpty());
  }

  @Test
  @SuppressWarnings("PMD.UseAssertTrueInsteadOfAssertEquals") // PMD has a bad heuristic here.
  public void testParseSimpleMap() throws IOException {
    Reader reader = new StringReader(
        "{" +
            "'FOO': 'BAR'," +
            "'MOL': 42," +
            "'WORKING': true" +
        "}".replace('\'', '\"'));
    Map<String, Object> map = RawParser.parseFromReader(reader);
    assertEquals(
        ImmutableMap.<String, Object>of(
            "FOO", "BAR",
            "MOL", 42L,
            "WORKING", true),
        map);
  }
}
