/*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * 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.util;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assume.assumeThat;

import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.io.File;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.hamcrest.Matchers;
import org.junit.Test;

public class ByteBufferReplacerTest {

  @Test
  public void charSets() {
    assumeThat(Charset.defaultCharset(), Matchers.equalTo(Charsets.UTF_8));

    String blob = "something \n \ud003\ud001hello/world \n something";
    String fixedBlob = "something \n \ud003\ud001replaced/// \n something";

    Path original = Paths.get("\ud003\ud001hello/world");
    Path replacement = Paths.get("\ud003\ud001replaced");

    ImmutableList<Charset> charSets =
        ImmutableList.of(
            Charsets.ISO_8859_1,
            Charsets.US_ASCII,
            Charsets.UTF_8,
            Charsets.UTF_16,
            Charsets.UTF_16BE,
            Charsets.UTF_16LE);

    for (Charset charset : charSets) {
      ByteBufferReplacer replacer =
          ByteBufferReplacer.fromPaths(
              ImmutableMap.of(original, replacement), File.separatorChar, charset);
      byte[] rawBytes = blob.getBytes(charset);
      int numReplacements = replacer.replace(ByteBuffer.wrap(rawBytes));
      assertEquals(String.format("Charset %s", charset), 1, numReplacements);
      assertArrayEquals(
          String.format(
              "Charset %s: \'%s\' != \'%s\'", charset, fixedBlob, new String(rawBytes, charset)),
          fixedBlob.getBytes(charset),
          rawBytes);
    }
  }
}
