package eu.project.ttc.test.unit; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.util.List; import org.assertj.core.api.AbstractAssert; import org.hamcrest.BaseDescription; import org.hamcrest.Matcher; import com.google.common.base.Joiner; import com.google.common.base.Objects; import com.google.common.base.Splitter; public class StringAssert extends AbstractAssert<StringAssert, String> { public StringAssert(String actual) { super(actual, StringAssert.class); } private String getLine(int lineNum) { BufferedReader reader = new BufferedReader(new StringReader(this.actual)); int i = 0; try { String line; while ((line = reader.readLine()) != null) { i++; if(lineNum == i) return line; } } catch (IOException e) { throw new RuntimeException(e); } throw new RuntimeException(String.format("String has only %d lines. Requested line: %d", i, lineNum)); } public StringAssert lineEquals(int lineNum, String expectedLine) { if(!getLine(lineNum).equals(expectedLine)) failWithMessage("Expected text at line %s was <%s>, but actual is <%s>", lineNum, expectedLine, getLine(lineNum)); return this; } public StringAssert tsvLineEquals(int lineNum, Object... expectedValues) { String[] actualValues = tsvLine(getLine(lineNum)); if(actualValues.length != expectedValues.length) { failWithMessage("Expected line %s to have <%s> values, but actual line has <%s> values: <%s>", lineNum, expectedValues.length, actualValues.length, Joiner.on(",").join(actualValues) ); return this; } for(int i = 0; i< actualValues.length; i++) { if(!Objects.equal(actualValues[i], expectedValues[i].toString())) { failWithMessage("Expected value at line %s and column %s was <%s>, but actual value is <%s>", lineNum, i+1, expectedValues[i], actualValues[i]); return this; } } return this; } private String[] tsvLine(String line) { List<String> l = Splitter.on("\t").splitToList(line); return l.toArray(new String[l.size()]); } public StringAssert hasLineCount(int expected) { if(getLineCount(actual) != expected) failWithMessage("Expected string to have <%s> lines, but actual number of lines is <%s>", expected, getLineCount(actual)); return this; } public int getLineCount(String string) { BufferedReader reader = new BufferedReader(new StringReader(this.actual)); int i = 0; try { while (reader.readLine() != null) i++; return i; } catch (IOException e) { throw new RuntimeException(e); } } public StringAssert atLine(int i, Matcher<String> matcher) { if(!matcher.matches(getLine(i))) failWithMessage("Expected to match <%s> at line <%s>, but actual string is <%s>", matcher.toString(), i, getLine(i)); return this; } }