package com.annimon.stream.intstreamtests;

import com.annimon.stream.Collectors;
import com.annimon.stream.IntStream;
import com.annimon.stream.function.IntFunction;
import com.annimon.stream.iterator.PrimitiveIterator;
import java.util.NoSuchElementException;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

public class OfCodePointTest {

    @Test
    public void testCommonSequence() {
        String input = "hi";

        String result = IntStream.ofCodePoints(input)
                .mapToObj(new IntFunction<String>() {
                    @Override
                    public String apply(int i) {
                        return String.valueOf(Character.toChars(i));
                    }
                }).collect(Collectors.joining());

        assertThat(input, is(result));
    }

    @Test
    public void testSequenceHavingFourBytesEmoji() {
        String input = "This is a emoji \uD83D\uDCA9!";

        String result = IntStream.ofCodePoints(input)
                .mapToObj(new IntFunction<String>() {
                    @Override
                    public String apply(int i) {
                        return String.valueOf(Character.toChars(i));
                    }
                }).collect(Collectors.joining());

        assertThat(input, is(result));
    }

    @Test(expected = NoSuchElementException.class)
    public void testNoSuchElement() {
        PrimitiveIterator.OfInt iterator = IntStream.ofCodePoints("test").iterator();
        iterator.nextInt();
        iterator.nextInt();
        iterator.nextInt();
        iterator.nextInt();
        iterator.nextInt();
    }

    @Test
    public void testStringBuilder() {
        final String input = "test";

        final StringBuilder sb = new StringBuilder(input);
        String result = IntStream.ofCodePoints(sb)
                .mapToObj(new IntFunction<String>() {
                    @Override
                    public String apply(int i) {
                        return String.valueOf(Character.toChars(i));
                    }
                }).collect(Collectors.joining());

        assertThat(input, is(result));
    }
}