/* Copyright (c) 2016, Martin Grotzke
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
 * conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
 * disclaimer in the documentation and/or other materials provided with the distribution.
 * - Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */

package com.esotericsoftware.kryo.serializers;

import com.esotericsoftware.kryo.KryoTestCase;

import java.util.*;

import static com.esotericsoftware.kryo.util.JavaVersion.isJava;
import static org.junit.Assume.assumeTrue;

public class OptionalSerializersTest extends KryoTestCase {

    {
        supportsCopy = true;
    }

    @Override
    protected void setUp() throws Exception {

        assumeTrue(isJava(8));

        super.setUp();
        kryo.register(Optional.class);
        kryo.register(OptionalInt.class);
        kryo.register(OptionalLong.class);
        kryo.register(OptionalDouble.class);
        kryo.register(TestClass.class);
    }

    public void testOptional() {
        roundTrip(2, 2, new TestClass(null));
        roundTrip(3, 3, new TestClass(Optional.<String>empty()));
        roundTrip(6, 6, new TestClass(Optional.of("foo")));
    }

    public void testOptionalInt() {
        roundTrip(2, 2, OptionalInt.empty());
        roundTrip(6, 6, OptionalInt.of(Integer.MIN_VALUE));
        roundTrip(6, 6, OptionalInt.of(Integer.MAX_VALUE));
    }

    public void testOptionalLong() {
        roundTrip(2, 2, OptionalLong.empty());
        roundTrip(10, 10, OptionalLong.of(Long.MIN_VALUE));
        roundTrip(10, 10, OptionalLong.of(Long.MAX_VALUE));
    }

    public void testOptionalDouble() {
        roundTrip(2, 2, OptionalDouble.empty());
        roundTrip(10, 10, OptionalDouble.of(Double.MIN_VALUE));
        roundTrip(10, 10, OptionalDouble.of(Double.MAX_VALUE));
    }

    static class TestClass {
        Optional<String> maybe;
        public TestClass() {}
        public TestClass(Optional<String> maybe) {
            this.maybe = maybe;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            TestClass testClass = (TestClass) o;
            return Objects.equals(maybe, testClass.maybe);

        }

        @Override
        public int hashCode() {
            return Objects.hashCode(maybe);
        }
    }

}

@@ -1619,16 +1619,160 @@
 estCase;
+%0Aimport org.junit.Before;%0Aimport org.junit.BeforeClass;%0Aimport org.junit.Test;%0Aimport org.junit.runner.RunWith;%0Aimport org.junit.runners.JUnit4;
 %0A%0Aimport
@@ -1895,16 +1895,100 @@
 eTrue;%0A%0A
+@RunWith(JUnit4.class) // needed for Assume (since 4.4), junit3 would fail the test%0A
 public c
@@ -2091,95 +2091,167 @@
    @
-Override%0A    protected void setUp() throws Exception %7B%0A%0A        assumeTrue(isJava(8));%0A
+BeforeClass()%0A    public static void beforeClass() %7B%0A        assumeTrue(isJava(8));%0A    %7D%0A%0A    @Override%0A    @Before%0A    public void setUp() throws Exception %7B
 %0A   
@@ -2478,32 +2478,42 @@
 .class);%0A    %7D%0A%0A
+    @Test%0A
     public void 
@@ -2700,32 +2700,42 @@
 foo%22)));%0A    %7D%0A%0A
+    @Test%0A
     public void 
@@ -2919,32 +2919,42 @@
 VALUE));%0A    %7D%0A%0A
+    @Test%0A
     public void 
@@ -3144,24 +3144,34 @@
 E));%0A    %7D%0A%0A
+    @Test%0A
     public v

Fix test: Activate junit4 for proper handling of Assume