// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.impl.google.naming;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static com.google.common.truth.Truth.assertThat;

/**
 * Unit tests for {@link NamingUtil#escape}, {@link NamingUtil#unescape},
 * {@link NamingUtil#encodeAsNameElement} and {@link NamingUtil#decodeFromNameElement(String)}
 */
@RunWith(Parameterized.class)
public class NamingUtilEscapingTest {
    private final String input;
    private final String encodedInput;

    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
            {"", ""},
            {"/", "%2F"},
            {"%", "%25"},
            {"/The % rain in /% Spain", "%2FThe %25 rain in %2F%25 Spain"},
            {"/%/%", "%2F%25%2F%25"},
            {"ᚸӲ읔+קAل", "ᚸӲ읔+קAل"},
            {"ᚸ/Ӳ%읔/ק%A+ل", "ᚸ%2FӲ%25읔%2Fק%25A+ل"},
        });
    }

    public NamingUtilEscapingTest(String input, String encodedInput) {
        this.input = input;
        this.encodedInput = encodedInput;
    }

    @Test
    public void testEncodingNameElements() {
        assertThat(NamingUtil.encodeAsNameElement(input)).isEqualTo(encodedInput);
    }

    @Test
    public void testDecodingNameElements() {
        assertThat(NamingUtil.decodeFromNameElement(encodedInput)).isEqualTo(input);
    }

    @Test
    public void testEscapingMultipleCharacters() {
        String input = "ᚸ/Ӳ%읔/ק%A+ل";
        // Escape multiple characters, also % in special should be ignored since
        // % is always escaped regardless.
        String escaped = NamingUtil.escape(input, new char[] {'/','읔','%'});
        assertThat(escaped).doesNotContain("읔");
        assertThat(escaped).contains("Ӳ");
        assertThat(NamingUtil.unescape(escaped)).isEqualTo(input);
    }
}