package org.reactfx;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;

import org.junit.Test;

public class SuspendedWhenTest {

    @Test
    public void test() {
        Property<Integer> p = new SimpleObjectProperty<>(0);
        BooleanProperty suspended = new SimpleBooleanProperty(true);
        List<Integer> emitted = new ArrayList<>();
        SuspendableEventStream<Integer> pausable = EventStreams.valuesOf(p).pausable();
        Subscription sub = pausable.suspendedWhen(suspended).subscribe(emitted::add);

        // test that the stream started suspended
        assertEquals(Arrays.asList(), emitted);

        suspended.set(false);
        assertEquals(Arrays.asList(0), emitted);

        p.setValue(1);
        assertEquals(Arrays.asList(0, 1), emitted);

        suspended.set(true);
        p.setValue(2);
        p.setValue(3);
        p.setValue(4);
        assertEquals(Arrays.asList(0, 1), emitted);

        List<Integer> emitted2 = new ArrayList<>();
        pausable.subscribe(emitted2::add);
        assertEquals(Arrays.asList(), emitted2);

        suspended.set(false);
        assertEquals(Arrays.asList(0, 1, 2, 3, 4), emitted);
        assertEquals(Arrays.asList(2, 3, 4), emitted2);

        suspended.set(true);
        p.setValue(5);
        p.setValue(6);
        assertEquals(Arrays.asList(2, 3, 4), emitted2);
        sub.unsubscribe(); // testing resume on unsubscribe
        assertEquals(Arrays.asList(0, 1, 2, 3, 4), emitted);
        assertEquals(Arrays.asList(2, 3, 4, 5, 6), emitted2);
    }

}