feat: add Lab4
This commit is contained in:
parent
c4d857ed02
commit
46d4fa5e9d
@ -34,7 +34,7 @@ do
|
|||||||
else
|
else
|
||||||
out=$(mktemp --suffix=$PROG)
|
out=$(mktemp --suffix=$PROG)
|
||||||
fi
|
fi
|
||||||
java $PROG < inputs/$PROG.$i.in | head -c 50MB > $out
|
java $PROG < inputs/$PROG.$i.in > $out
|
||||||
status="$?"
|
status="$?"
|
||||||
if [ "$status" -ne "0" ]
|
if [ "$status" -ne "0" ]
|
||||||
then
|
then
|
||||||
@ -72,5 +72,6 @@ then
|
|||||||
echo "$PROG: passed everything 🎉"
|
echo "$PROG: passed everything 🎉"
|
||||||
fi
|
fi
|
||||||
# Run style checker
|
# Run style checker
|
||||||
java -jar ~cs2030s/bin/checkstyle.jar -c ~cs2030s/bin/cs2030_checks.xml *.java
|
#java -jar ~cs2030s/bin/checkstyle.jar -c ~cs2030s/bin/cs2030_checks.xml *.java
|
||||||
|
java -jar ./checkstyle.jar -c ./cs2030_checks.xml *.java
|
||||||
# vim:noexpandtab:sw=4:ts=4
|
# vim:noexpandtab:sw=4:ts=4
|
11
Lab4/Action.java
Normal file
11
Lab4/Action.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* The Action interface that can be called
|
||||||
|
* on an object of type T to act.
|
||||||
|
*
|
||||||
|
* Contains a single abstract method call.
|
||||||
|
*
|
||||||
|
* CS2030S Lab 4
|
||||||
|
* AY22/23 Semester 1
|
||||||
|
*
|
||||||
|
* @author Put Your Name (Lab Group)
|
||||||
|
*/
|
11
Lab4/Actionable.java
Normal file
11
Lab4/Actionable.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* The Actionable interface that can
|
||||||
|
* act when given an action.
|
||||||
|
*
|
||||||
|
* Contains a single abstract method act.
|
||||||
|
*
|
||||||
|
* CS2030S Lab 4
|
||||||
|
* AY22/23 Semester 1
|
||||||
|
*
|
||||||
|
* @author Put Your Name (Lab Group)
|
||||||
|
*/
|
12
Lab4/Applicable.java
Normal file
12
Lab4/Applicable.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* The Applicable interface that can probably
|
||||||
|
* transform if given something that is
|
||||||
|
* probably an Immutator.
|
||||||
|
*
|
||||||
|
* Contains a single abstract method apply.
|
||||||
|
*
|
||||||
|
* CS2030S Lab 4
|
||||||
|
* AY22/23 Semester 1
|
||||||
|
*
|
||||||
|
* @author Put Your Name (Lab Group)
|
||||||
|
*/
|
75
Lab4/CS2030STest.java
Normal file
75
Lab4/CS2030STest.java
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import java.net.URI;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.tools.DiagnosticCollector;
|
||||||
|
import javax.tools.SimpleJavaFileObject;
|
||||||
|
import javax.tools.ToolProvider;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
class CS2030STest {
|
||||||
|
|
||||||
|
private static final String ANSI_RESET = "\u001B[0m";
|
||||||
|
private static final String ANSI_RED = "\u001B[31m";
|
||||||
|
private static final String ANSI_GREEN = "\u001B[32m";
|
||||||
|
|
||||||
|
public void expect(String test, Object output, Object expect) {
|
||||||
|
System.out.print(test);
|
||||||
|
if ((expect == null && output == null) || output.equals(expect)) {
|
||||||
|
System.out.println(".. " + ANSI_GREEN + "ok" + ANSI_RESET);
|
||||||
|
} else {
|
||||||
|
System.out.println(".. " + ANSI_RED + "failed" + ANSI_RESET);
|
||||||
|
System.out.println(" expected: " + expect);
|
||||||
|
System.out.println(" got this: " + output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String clean(String txt) {
|
||||||
|
String res = "";
|
||||||
|
for (int i=0; i<txt.length(); i++) {
|
||||||
|
if (txt.charAt(i) != '\r' && txt.charAt(i) != '\n') {
|
||||||
|
res += txt.charAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
public void expectPrint(String test, Object expect, ByteArrayOutputStream baos, PrintStream old) {
|
||||||
|
System.out.flush();
|
||||||
|
System.setOut(old);
|
||||||
|
expect(test, CS2030STest.clean(baos.toString()), expect);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void expectCompile(String test, String statement, boolean success) {
|
||||||
|
System.out.print(test);
|
||||||
|
|
||||||
|
class JavaSourceFromString extends SimpleJavaFileObject {
|
||||||
|
final String code;
|
||||||
|
|
||||||
|
JavaSourceFromString(String code) {
|
||||||
|
super(URI.create("string:///TempClass.java"), Kind.SOURCE);
|
||||||
|
this.code = "class TempClass {void foo(){" + code + ";}}";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean noError = ToolProvider
|
||||||
|
.getSystemJavaCompiler()
|
||||||
|
.getTask(null, null, new DiagnosticCollector<>(), null, null,
|
||||||
|
List.of(new JavaSourceFromString(statement)))
|
||||||
|
.call();
|
||||||
|
|
||||||
|
if (noError != success) {
|
||||||
|
System.out.println(".. " + ANSI_RED + "failed" + ANSI_RESET);
|
||||||
|
if (!success) {
|
||||||
|
System.out.println(" expected compilation error but it compiles fine.");
|
||||||
|
} else {
|
||||||
|
System.out.println(" expected the statement to compile without errors but it does not.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.out.println(".. " + ANSI_GREEN + "ok" + ANSI_RESET);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
Lab4/Immutator.java
Normal file
11
Lab4/Immutator.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* The Immutator interface that can transform
|
||||||
|
* to type T2, an object of type T1.
|
||||||
|
*
|
||||||
|
* Contains a single abstract method invoke.
|
||||||
|
*
|
||||||
|
* CS2030S Lab 4
|
||||||
|
* AY22/23 Semester 1
|
||||||
|
*
|
||||||
|
* @author Put Your Name (Lab Group)
|
||||||
|
*/
|
12
Lab4/Immutatorable.java
Normal file
12
Lab4/Immutatorable.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* The Immutatorable interface that can
|
||||||
|
* transform when given something that is
|
||||||
|
* Immutator.
|
||||||
|
*
|
||||||
|
* Contains a single abstract method transform.
|
||||||
|
*
|
||||||
|
* CS2030S Lab 4
|
||||||
|
* AY22/23 Semester 1
|
||||||
|
*
|
||||||
|
* @author Put Your Name (Lab Group)
|
||||||
|
*/
|
9
Lab4/Improbable.java
Normal file
9
Lab4/Improbable.java
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* A generic Immutator that takes in an object
|
||||||
|
* that is T and returns an object that is probably T.
|
||||||
|
*
|
||||||
|
* CS2030S Lab 4
|
||||||
|
* AY22/23 Semester 1
|
||||||
|
*
|
||||||
|
* @author Put Your Name (Lab Group)
|
||||||
|
*/
|
12
Lab4/IsModEq.java
Normal file
12
Lab4/IsModEq.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* A non-generic Immutator with parameter
|
||||||
|
* div and mod that takes in an integer val
|
||||||
|
* and return the boolean value by checking
|
||||||
|
* if the given value is equal to mod when
|
||||||
|
* divided by div.
|
||||||
|
*
|
||||||
|
* CS2030S Lab 4
|
||||||
|
* AY22/23 Semester 1
|
||||||
|
*
|
||||||
|
* @author Put Your Name (Lab Group)
|
||||||
|
*/
|
247
Lab4/Lab4.java
Normal file
247
Lab4/Lab4.java
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
import java.util.Scanner;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main class for CS2030S Lab 4.
|
||||||
|
*
|
||||||
|
* @author Wei Tsang
|
||||||
|
* @version CS2030S AY21/22 Semester 2
|
||||||
|
*/
|
||||||
|
class Lab4 {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inner class for testing.
|
||||||
|
*/
|
||||||
|
static class Incr implements Immutator<Integer,Integer> {
|
||||||
|
public Integer invoke(Integer t1) {
|
||||||
|
return t1 + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Inner class for testing.
|
||||||
|
*/
|
||||||
|
static class Length implements Immutator<Integer,String> {
|
||||||
|
public Integer invoke(String t1) {
|
||||||
|
return t1.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to clean a string from
|
||||||
|
* any newline.
|
||||||
|
*
|
||||||
|
* @param txt Input string.
|
||||||
|
* @return The cleaned string.
|
||||||
|
*/
|
||||||
|
public static String clean(String txt) {
|
||||||
|
String res = "";
|
||||||
|
for (int i=0; i<txt.length(); i++) {
|
||||||
|
if (txt.charAt(i) != '\r' && txt.charAt(i) != '\n') {
|
||||||
|
res += txt.charAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// Create a scanner to read from standard input.
|
||||||
|
Scanner sc = new Scanner(System.in);
|
||||||
|
|
||||||
|
// Read a single integer from the test file
|
||||||
|
// and then run the appropriate test case
|
||||||
|
switch (sc.nextInt()) {
|
||||||
|
case 1:
|
||||||
|
test1();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
test2();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
test3();
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
test4();
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
test5();
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
test6();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up the scanner.
|
||||||
|
sc.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test #1.
|
||||||
|
*/
|
||||||
|
public static void test1() {
|
||||||
|
PrintStream old = System.out;
|
||||||
|
ByteArrayOutputStream baos;
|
||||||
|
PrintStream ps;
|
||||||
|
|
||||||
|
try {
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
new Print().call(17);
|
||||||
|
System.out.flush();
|
||||||
|
System.setOut(old);
|
||||||
|
|
||||||
|
System.out.println(Lab4.clean(baos.toString()));
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
new Print().call("string");
|
||||||
|
System.out.flush();
|
||||||
|
System.setOut(old);
|
||||||
|
|
||||||
|
System.out.println(Lab4.clean(baos.toString()));
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test #2.
|
||||||
|
*/
|
||||||
|
public static void test2() {
|
||||||
|
PrintStream old = System.out;
|
||||||
|
ByteArrayOutputStream baos;
|
||||||
|
PrintStream ps;
|
||||||
|
|
||||||
|
try {
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
Probably.just(4).act(new Print());
|
||||||
|
System.out.flush();
|
||||||
|
System.setOut(old);
|
||||||
|
|
||||||
|
System.out.println(Lab4.clean(baos.toString()));
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
Probably.just("string").act(new Print());
|
||||||
|
System.out.flush();
|
||||||
|
System.setOut(old);
|
||||||
|
|
||||||
|
System.out.println(Lab4.clean(baos.toString()));
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
Probably.none().act(new Print());
|
||||||
|
System.out.flush();
|
||||||
|
System.setOut(old);
|
||||||
|
|
||||||
|
System.out.println(Lab4.clean(baos.toString()));
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test #3.
|
||||||
|
*/
|
||||||
|
public static void test3() {
|
||||||
|
try {
|
||||||
|
System.out.println(new Incr().invoke(4).toString());
|
||||||
|
System.out.println(new Incr().invoke(new Incr().invoke(4)).toString());
|
||||||
|
System.out.println(new Length().invoke("string").toString());
|
||||||
|
System.out.println(new Incr().invoke(new Length().invoke("string")).toString());
|
||||||
|
|
||||||
|
System.out.println(new Improbable<Integer>().invoke(1).toString());
|
||||||
|
System.out.println(new Improbable<String>().invoke(null).toString());
|
||||||
|
System.out.println(new Improbable<Integer>().invoke(1).transform(new Incr()).toString());
|
||||||
|
System.out.println(new Improbable<>().invoke(new Improbable<Integer>().invoke(1)).toString());
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test #4.
|
||||||
|
*/
|
||||||
|
public static void test4() {
|
||||||
|
try {
|
||||||
|
System.out.println(Probably.just(4).transform(new Incr()).toString());
|
||||||
|
System.out.println(Probably.just(4).transform(new Incr()).transform(new Incr()).toString());
|
||||||
|
System.out.println(Probably.just("string").transform(new Length()).toString());
|
||||||
|
System.out.println(Probably.just("string").transform(new Length()).transform(new Incr()).toString());
|
||||||
|
|
||||||
|
System.out.println(Probably.<Integer>none().transform(new Incr()).toString());
|
||||||
|
System.out.println(Probably.<String>none().transform(new Length()).toString());
|
||||||
|
System.out.println(Probably.<String>just(null).transform(new Length()).transform(new Incr()).toString());
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test #5.
|
||||||
|
*/
|
||||||
|
public static void test5() {
|
||||||
|
Probably<Immutator<Integer,Integer>> justIncr = Probably.just(new Incr());
|
||||||
|
Probably<Immutator<Integer,String>> justLength = Probably.just(new Length());
|
||||||
|
Probably<Immutator<Integer,Integer>> noIncr = Probably.none();
|
||||||
|
Probably<Immutator<Integer,String>> noLength = Probably.none();
|
||||||
|
|
||||||
|
try {
|
||||||
|
System.out.println(Probably.just(17).check(new IsModEq(3,2)).toString());
|
||||||
|
System.out.println(Probably.just(18).check(new IsModEq(3,2)).toString());
|
||||||
|
|
||||||
|
System.out.println(Probably.just(16).transform(new Incr()).check(new IsModEq(3,2)).toString());
|
||||||
|
System.out.println(Probably.just("string").transform(new Length()).transform(new Incr()).transform(new Incr()).check(new IsModEq(3,2)).toString());
|
||||||
|
System.out.println(Probably.<Integer>just(null).check(new IsModEq(0,2)).toString());
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test #6.
|
||||||
|
*/
|
||||||
|
public static void test6() {
|
||||||
|
Probably<Immutator<Integer,Integer>> justIncr = Probably.just(new Incr());
|
||||||
|
Probably<Immutator<Integer,String>> justLength = Probably.just(new Length());
|
||||||
|
Probably<Immutator<Integer,Integer>> noIncr = Probably.none();
|
||||||
|
Probably<Immutator<Integer,String>> noLength = Probably.none();
|
||||||
|
|
||||||
|
try {
|
||||||
|
System.out.println(Probably.just(17).apply(justIncr).toString());
|
||||||
|
System.out.println(Probably.<Integer>none().apply(justIncr).toString());
|
||||||
|
System.out.println(Probably.just(17).apply(noIncr).toString());
|
||||||
|
System.out.println(Probably.<Integer>none().apply(noIncr).toString());
|
||||||
|
|
||||||
|
System.out.println(Probably.just("string").apply(justLength).toString());
|
||||||
|
System.out.println(Probably.<String>none().apply(justLength).toString());
|
||||||
|
System.out.println(Probably.just("string").apply(noLength).toString());
|
||||||
|
System.out.println(Probably.<String>none().apply(noLength).toString());
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Error occurred");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
Lab4/Lab4.pdf
Normal file
BIN
Lab4/Lab4.pdf
Normal file
Binary file not shown.
9
Lab4/Print.java
Normal file
9
Lab4/Print.java
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* A non-generic Action to print the String
|
||||||
|
* representation of the object.
|
||||||
|
*
|
||||||
|
* CS2030S Lab 4
|
||||||
|
* AY22/23 Semester 1
|
||||||
|
*
|
||||||
|
* @author Put Your Name (Lab Group)
|
||||||
|
*/
|
96
Lab4/Probably.java
Normal file
96
Lab4/Probably.java
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
* This class implements something that
|
||||||
|
* probably is just a value but may be nothing.
|
||||||
|
* We will never return null in this class, but
|
||||||
|
* we may return something that contains nothing
|
||||||
|
* where the nothing is a null.
|
||||||
|
*
|
||||||
|
* @author XXX
|
||||||
|
* @version CS2030S AY22/23 Semester 1
|
||||||
|
*/
|
||||||
|
class Probably<T> {
|
||||||
|
private final T value;
|
||||||
|
|
||||||
|
private static final Probably<?> NONE = new Probably<>(null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private constructor, can only be invoked inside.
|
||||||
|
* This is called a factory method. We can only
|
||||||
|
* create this using the two public static method.
|
||||||
|
*
|
||||||
|
* @return The shared NOTHING.
|
||||||
|
*/
|
||||||
|
private Probably(T value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It is probably nothing, no value inside.
|
||||||
|
*
|
||||||
|
* @return The shared NOTHING.
|
||||||
|
*/
|
||||||
|
public static <T> Probably<T> none() {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Probably<T> res = (Probably<T>) NONE;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It is probably just the given value.
|
||||||
|
* Unless the value is null, then nothing is
|
||||||
|
* given again.
|
||||||
|
*
|
||||||
|
* @param value Probably this is the value
|
||||||
|
* unless it is null then we say
|
||||||
|
* that there is no
|
||||||
|
* @return The given value or nothing but
|
||||||
|
* never null.
|
||||||
|
*/
|
||||||
|
public static <T> Probably<T> just(T value) {
|
||||||
|
if (value == null) {
|
||||||
|
return none();
|
||||||
|
}
|
||||||
|
return (Probably<T>) new Probably<>(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for equality between something that
|
||||||
|
* is probably a value but maybe nothing.
|
||||||
|
*
|
||||||
|
* @param obj The other value to be compared.
|
||||||
|
* @return True if the two values are equal,
|
||||||
|
* false otherwise.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj == this) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (obj instanceof Probably<?>) {
|
||||||
|
Probably<?> some = (Probably<?>) obj;
|
||||||
|
if (this.value == some.value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (this.value == null || some.value == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return this.value.equals(some.value);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String representation of something that
|
||||||
|
* is probably a value but maybe nothing.
|
||||||
|
*
|
||||||
|
* @return The string representation.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if (this.value == null) {
|
||||||
|
return "<>";
|
||||||
|
} else {
|
||||||
|
return "<" + this.value.toString() + ">";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
Lab4/Test1.java
Normal file
35
Lab4/Test1.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
class Test1 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
CS2030STest we = new CS2030STest();
|
||||||
|
|
||||||
|
PrintStream old = System.out;
|
||||||
|
ByteArrayOutputStream baos;
|
||||||
|
PrintStream ps;
|
||||||
|
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
new Print().call(17);
|
||||||
|
we.expectPrint("new Print().call(17)",
|
||||||
|
"17",
|
||||||
|
baos,
|
||||||
|
old);
|
||||||
|
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
new Print().call("string");
|
||||||
|
we.expectPrint("new Print().call(\"string\")",
|
||||||
|
"string",
|
||||||
|
baos,
|
||||||
|
old);
|
||||||
|
|
||||||
|
we.showStat();
|
||||||
|
we.print();
|
||||||
|
}
|
||||||
|
}
|
45
Lab4/Test2.java
Normal file
45
Lab4/Test2.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
class Test2 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
CS2030STest we = new CS2030STest();
|
||||||
|
|
||||||
|
PrintStream old = System.out;
|
||||||
|
ByteArrayOutputStream baos;
|
||||||
|
PrintStream ps;
|
||||||
|
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
Probably.just(4).act(new Print());
|
||||||
|
we.expectPrint("Probably.just(4).act(new Print())",
|
||||||
|
"4",
|
||||||
|
baos,
|
||||||
|
old);
|
||||||
|
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
Probably.just("string").act(new Print());
|
||||||
|
we.expectPrint("Probably.just(\"string\").act(new Print())",
|
||||||
|
"string",
|
||||||
|
baos,
|
||||||
|
old);
|
||||||
|
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
ps = new PrintStream(baos);
|
||||||
|
System.setOut(ps);
|
||||||
|
|
||||||
|
Probably.none().act(new Print());
|
||||||
|
we.expectPrint("Probably.none().act(new Print())",
|
||||||
|
"",
|
||||||
|
baos,
|
||||||
|
old);
|
||||||
|
|
||||||
|
we.showStat();
|
||||||
|
we.print();
|
||||||
|
}
|
||||||
|
}
|
57
Lab4/Test3.java
Normal file
57
Lab4/Test3.java
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
class Test3 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
CS2030STest we = new CS2030STest();
|
||||||
|
|
||||||
|
class Incr implements Immutator<Integer,Integer> {
|
||||||
|
public Integer invoke(Integer t1) {
|
||||||
|
return t1 + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Length implements Immutator<Integer,String> {
|
||||||
|
public Integer invoke(String t1) {
|
||||||
|
return t1.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
we.prefix("jshell> class Incr implements Immutator<Integer,Integer> {");
|
||||||
|
we.prefix(" ...> public Integer invoke(Integer t1) {");
|
||||||
|
we.prefix(" ...> return t1 + 1;");
|
||||||
|
we.prefix(" ...> }");
|
||||||
|
we.prefix(" ...> }");
|
||||||
|
|
||||||
|
we.prefix("jshell> class Length implements Immutator<Integer,String> {");
|
||||||
|
we.prefix(" ...> public Integer invoke(String t1) {");
|
||||||
|
we.prefix(" ...> return t1.length();");
|
||||||
|
we.prefix(" ...> }");
|
||||||
|
we.prefix(" ...> }");
|
||||||
|
|
||||||
|
we.expect("new Incr().invoke(4)",
|
||||||
|
new Incr().invoke(4).toString(),
|
||||||
|
"5");
|
||||||
|
we.expect("new Incr().invoke(new Incr().invoke(4))",
|
||||||
|
new Incr().invoke(new Incr().invoke(4)).toString(),
|
||||||
|
"6");
|
||||||
|
we.expect("new Length().invoke(\"string\")",
|
||||||
|
new Length().invoke("string").toString(),
|
||||||
|
"6");
|
||||||
|
we.expect("new Incr().invoke(new Length().invoke(\"string\"))",
|
||||||
|
new Incr().invoke(new Length().invoke("string")).toString(),
|
||||||
|
"7");
|
||||||
|
|
||||||
|
we.expect("new Improbable<>().invoke(1)",
|
||||||
|
new Improbable<Integer>().invoke(1).toString(),
|
||||||
|
"<1>");
|
||||||
|
we.expect("new Improbable<String>().invoke(null)",
|
||||||
|
new Improbable<String>().invoke(null).toString(),
|
||||||
|
"<>");
|
||||||
|
we.expect("new Improbable<Integer>().invoke(1).transform(new Incr())",
|
||||||
|
new Improbable<Integer>().invoke(1).transform(new Incr()).toString(),
|
||||||
|
"<2>");
|
||||||
|
we.expect("new Improbable<>().invoke(new Improbable<>().invoke(1))",
|
||||||
|
new Improbable<>().invoke(new Improbable<Integer>().invoke(1)).toString(),
|
||||||
|
"<<1>>");
|
||||||
|
|
||||||
|
we.showStat();
|
||||||
|
we.print();
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user