package org.junit.tests.experimental.theories.runner;

import static org.junit.Assert.assertEquals;
import static org.junit.tests.experimental.theories.TheoryTestUtils.potentialAssignments;
import org.junit.Test;
import org.junit.experimental.theories.DataPoint;
import org.junit.experimental.theories.Theories;
import org.junit.runner.RunWith;

public class WithAutoGeneratedDataPoints {

    private enum ENUM { VALUE, OTHER_VALUE, THIRD_VALUE };
    
    @RunWith(Theories.class)
    public static class TheoryTestClassWithAutogeneratedParameterValues {
        
        public void theory(ENUM e) {
        }
        
        public void theory(boolean b) {
        }
        
    }
    
    @Test
    public void shouldAutomaticallyGenerateEnumDataPoints() throws Throwable {
        assertEquals(ENUM.values().length, potentialAssignments(
                TheoryTestClassWithAutogeneratedParameterValues.class.getMethod("theory", ENUM.class)).size());
    }
    
    @Test
    public void shouldAutomaticallyGenerateBooleanDataPoints() throws Throwable {
        assertEquals(2, potentialAssignments(
                TheoryTestClassWithAutogeneratedParameterValues.class.getMethod("theory", boolean.class)).size());
    }
    
    @RunWith(Theories.class)
    public static class TheoryTestClassWithSpecificEnumDataPoint {
        
        @DataPoint
        public static ENUM value = ENUM.OTHER_VALUE;
        
        public void theory(ENUM e) {
        }
        
    }
    
    @Test
    public void shouldNotAutogenerateEnumDataPointsWhenSpecificDataPointGiven() throws Throwable {
        assertEquals(1, potentialAssignments(
                TheoryTestClassWithSpecificEnumDataPoint.class.getMethod("theory", ENUM.class)).size());
    }
    
    @RunWith(Theories.class)
    public static class TheoryTestClassWithSpecificBooleanDataPoint {
        
        @DataPoint
        public static boolean value = true;
        
        public void theory(boolean b) {
        }
        
    }
    
    @Test
    public void shouldNotAutogenerateBooleanDataPointsWhenSpecificDataPointGiven() throws Throwable {
        assertEquals(1, potentialAssignments(
                TheoryTestClassWithSpecificBooleanDataPoint.class.getMethod("theory", boolean.class)).size());
    }    
    
}
