// CSE 143, Homework 3: HTML Validator
//
// Instructor-provided code.
// This program is a very simple test for your HTML validator object.
// Please feel free to modify this file to create your own simple test cases.
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.LinkedList;
import java.util.Queue;
import org.junit.Test;
/** A basic JUnit test for some methods of your HTML validator. */
public class SimpleTest {
// shared timeout in milliseconds, used by each test
private static final int TIMEOUT_MS = 2000;
@Test(timeout = TIMEOUT_MS)
public void test1_ValidGetTags() {
// first test for short valid code
//
hellohow are you
Queue tags = new LinkedList();
tags.add(new HtmlTag("html", true)); //
tags.add(new HtmlTag("body", true)); //
tags.add(new HtmlTag("b", true)); //
tags.add(new HtmlTag("b", false)); //
tags.add(new HtmlTag("i", true)); //
tags.add(new HtmlTag("b", true)); //
tags.add(new HtmlTag("b", false)); //
tags.add(new HtmlTag("br")); //
tags.add(new HtmlTag("i", false)); //
tags.add(new HtmlTag("body", false)); //
tags.add(new HtmlTag("html", false)); //
Queue tags2 = new LinkedList(tags);
HtmlValidator validator = new HtmlValidator(tags);
assertEquals("getTags", tags2, validator.getTags());
}
@Test(timeout = TIMEOUT_MS)
public void test2_ValidValidate() {
// first test for short valid code
// hellohow are you
Queue tags = new LinkedList();
tags.add(new HtmlTag("html", true)); //
tags.add(new HtmlTag("body", true)); //
tags.add(new HtmlTag("b", true)); //
tags.add(new HtmlTag("b", false)); //
tags.add(new HtmlTag("i", true)); //
tags.add(new HtmlTag("b", true)); //
tags.add(new HtmlTag("b", false)); //
tags.add(new HtmlTag("br")); //
tags.add(new HtmlTag("i", false)); //
tags.add(new HtmlTag("body", false)); //
tags.add(new HtmlTag("html", false)); //
HtmlValidator validator = new HtmlValidator(tags);
OutputCapturer.start();
validator.validate();
String output = OutputCapturer.stop();
String expectedOutput = "\n \n \n \n \n \n \n
\n \n \n\n";
assertEquals("validate output", expectedOutput, output);
}
@Test(timeout = TIMEOUT_MS)
public void test3_InvalidAddTag() {
// second test for invalid code and setTags
HtmlValidator validator = new HtmlValidator();
Queue tags = new LinkedList();
tags.add(new HtmlTag("html", true)); //
tags.add(new HtmlTag("body", true)); //
tags.add(new HtmlTag("b", true)); //
tags.add(new HtmlTag("body", false)); //
tags.add(new HtmlTag("b", false)); //
tags.add(new HtmlTag("html", false)); //
// students should not use a for-each loop over a Queue!
for (HtmlTag tag : tags) {
validator.addTag(tag);
}
assertEquals("getTags", tags, validator.getTags());
}
@Test(timeout = TIMEOUT_MS)
public void test4_InvalidValidate() {
HtmlValidator validator = new HtmlValidator();
Queue tags = new LinkedList();
tags.add(new HtmlTag("html", true)); //
tags.add(new HtmlTag("body", true)); //
tags.add(new HtmlTag("b", true)); //
tags.add(new HtmlTag("body", false)); //
tags.add(new HtmlTag("b", false)); //
tags.add(new HtmlTag("html", false)); //
// students should not use a for-each loop over a Queue!
for (HtmlTag tag : tags) {
validator.addTag(tag);
}
OutputCapturer.start();
validator.validate();
String output = OutputCapturer.stop();
String expectedOutput = "\n \n \nERROR unexpected tag: \n \nERROR unexpected tag: \nERROR unclosed tag: \nERROR unclosed tag: \n";
assertEquals("validate output", expectedOutput, output);
OutputCapturer.start();
validator.validate();
output = OutputCapturer.stop();
assertEquals("validate output (2nd call in a row)", expectedOutput, output);
}
/**
* This class has static methods for capturing console output (for methods
* that do printlns). You can use it in your own tests if you like.
*/
public static class OutputCapturer {
private static final PrintStream SYSTEM_OUT = java.lang.System.out;
private static final PrintStream SYSTEM_ERR = java.lang.System.err;
private static ByteArrayOutputStream outputStream = null;
/** Returns true if output is currently being captured. */
public static boolean isCapturing() {
return outputStream != null;
}
/** Begins capturing output. */
public static synchronized void start() {
if (isCapturing()) {
stop();
}
outputStream = new ByteArrayOutputStream(65536);
PrintStream out = new PrintStream(outputStream);
System.setOut(out);
System.setErr(out);
}
/** Stops capturing output and returns the string of captured output. */
public static synchronized String stop() {
String actualOutput = "";
if (isCapturing()) {
System.out.flush();
System.err.flush();
System.setOut(SYSTEM_OUT);
System.setErr(SYSTEM_ERR);
if (isCapturing()) {
actualOutput = outputStream.toString().replace("\r", "");
}
outputStream = null;
}
return actualOutput;
}
}
}