package beginner;

import com.sandwich.koan.Koan;

import static com.sandwich.koan.constant.KoanConstants.__;
import static com.sandwich.util.Assert.assertEquals;

public class AboutVarArgs {

    class ExampleClass {
        public boolean canBeTreatedAsArray(Integer... arguments) {
            return arguments instanceof Integer[];
        }

        public int getLength(Integer... arguments) {
            return arguments.length;
        }

        public String verboseLength(String prefix, Object... arguments) {
            return prefix + arguments.length;
        }

        // *******
        // The following methods won't compile because Java only permits varargs as last argument
	// *******
        // public String invalidMethodDeclaration(String... arguments, String... otherArguments) { return ""; }
        // public String otherInvalidMethodDeclaration(String... arguments, String otherArgument) { return ""; }
    }

    @Koan
    public void varArgsCanBeTreatedAsArrays() {
        assertEquals(new ExampleClass().canBeTreatedAsArray(1, 2, 3), __);
    }

    @Koan
    public void youCanPassInAsManyArgumentsAsYouLike() {
        assertEquals(new ExampleClass().getLength(1, 2, 3), __);
        assertEquals(new ExampleClass().getLength(1, 2, 3, 4, 5, 6, 7, 8), __);
    }

    @Koan
    public void youCanPassInZeroArgumentsIfYouLike() {
        assertEquals(new ExampleClass().getLength(), __);
    }

    @Koan
    public void youCanHaveOtherTypesInTheMethodSignature() {
        assertEquals(new ExampleClass().verboseLength("This is how many items were passed in: ", 1, 2, 3, 4), __); 
    }
}
