Disallow appending improper lists
This commit is contained in:
parent
ac365918b2
commit
9d13c3d892
|
@ -46,8 +46,10 @@ public class APPEND extends LispFunction {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArgumentValidator argumentValidator;
|
private ArgumentValidator argumentValidator;
|
||||||
|
private String name;
|
||||||
|
|
||||||
public APPEND(String name) {
|
public APPEND(String name) {
|
||||||
|
this.name = name;
|
||||||
this.argumentValidator = new ArgumentValidator(name);
|
this.argumentValidator = new ArgumentValidator(name);
|
||||||
this.argumentValidator.setExactNumberOfArguments(2);
|
this.argumentValidator.setExactNumberOfArguments(2);
|
||||||
this.argumentValidator.setEveryArgumentExpectedType(Cons.class);
|
this.argumentValidator.setEveryArgumentExpectedType(Cons.class);
|
||||||
|
@ -60,8 +62,15 @@ public class APPEND extends LispFunction {
|
||||||
Cons rest = (Cons) argumentList.getRest();
|
Cons rest = (Cons) argumentList.getRest();
|
||||||
Cons firstList = (Cons) argumentList.getFirst();
|
Cons firstList = (Cons) argumentList.getFirst();
|
||||||
Cons secondList = (Cons) rest.getFirst();
|
Cons secondList = (Cons) rest.getFirst();
|
||||||
|
validateLists(firstList, secondList);
|
||||||
|
|
||||||
return append(firstList, secondList);
|
return append(firstList, secondList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validateLists(Cons firstList, Cons secondList) {
|
||||||
|
ArgumentValidator properListValidatorOne = new ArgumentValidator(name + "|list-one|");
|
||||||
|
ArgumentValidator properListValidatorTwo = new ArgumentValidator(name + "|list-two|");
|
||||||
|
properListValidatorOne.validate(firstList);
|
||||||
|
properListValidatorTwo.validate(secondList);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import static testutil.TestUtilities.parseString;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import function.ArgumentValidator.BadArgumentTypeException;
|
import function.ArgumentValidator.BadArgumentTypeException;
|
||||||
|
import function.ArgumentValidator.DottedArgumentListException;
|
||||||
import function.ArgumentValidator.TooFewArgumentsException;
|
import function.ArgumentValidator.TooFewArgumentsException;
|
||||||
import function.ArgumentValidator.TooManyArgumentsException;
|
import function.ArgumentValidator.TooManyArgumentsException;
|
||||||
import testutil.SymbolAndFunctionCleaner;
|
import testutil.SymbolAndFunctionCleaner;
|
||||||
|
@ -51,6 +52,16 @@ public class APPENDTest extends SymbolAndFunctionCleaner {
|
||||||
assertSExpressionsMatch(parseString("(4 5 6)"), evaluateString("y"));
|
assertSExpressionsMatch(parseString("(4 5 6)"), evaluateString("y"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = DottedArgumentListException.class)
|
||||||
|
public void appendWithDottedFirstList() {
|
||||||
|
evaluateString("(append '(1 2) (cons 3 4))");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = DottedArgumentListException.class)
|
||||||
|
public void appendWithDottedSecondList() {
|
||||||
|
evaluateString("(append (cons 1 2) '(3 4))");
|
||||||
|
}
|
||||||
|
|
||||||
@Test(expected = TooManyArgumentsException.class)
|
@Test(expected = TooManyArgumentsException.class)
|
||||||
public void appendWithTooManyArguments() {
|
public void appendWithTooManyArguments() {
|
||||||
evaluateString("(append () () ())");
|
evaluateString("(append () () ())");
|
||||||
|
|
Loading…
Reference in New Issue