Skip to content

Commit a4c0db1

Browse files
author
nat.pryce
committed
added BaseDescription class, working on issue 13
1 parent ac1c38b commit a4c0db1

File tree

2 files changed

+123
-102
lines changed

2 files changed

+123
-102
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package org.hamcrest;
2+
3+
import static java.lang.String.valueOf;
4+
5+
import java.util.Arrays;
6+
import java.util.Iterator;
7+
8+
import org.hamcrest.internal.ArrayIterator;
9+
import org.hamcrest.internal.SelfDescribingValueIterator;
10+
11+
/**
12+
* A {@link Description} that is stored as a string.
13+
*/
14+
public abstract class BaseDescription implements Description {
15+
public Description appendText(String text) {
16+
append(text);
17+
return this;
18+
}
19+
20+
public Description appendValue(Object value) {
21+
if (value == null) {
22+
append("null");
23+
} else if (value instanceof String) {
24+
toJavaSyntax((String) value);
25+
} else if (value instanceof Character) {
26+
append('"');
27+
toJavaSyntax((Character) value);
28+
append('"');
29+
} else if (value instanceof Short) {
30+
append('<');
31+
append(valueOf(value));
32+
append("s>");
33+
} else if (value instanceof Long) {
34+
append('<');
35+
append(valueOf(value));
36+
append("L>");
37+
} else if (value instanceof Float) {
38+
append('<');
39+
append(valueOf(value));
40+
append("F>");
41+
} else if (value.getClass().isArray()) {
42+
appendValueList("[",", ","]", new ArrayIterator(value));
43+
} else {
44+
append('<');
45+
append(valueOf(value));
46+
append('>');
47+
}
48+
return this;
49+
}
50+
51+
public <T> Description appendValueList(String start, String separator, String end, T... values) {
52+
return appendValueList(start, separator, end, Arrays.asList(values));
53+
}
54+
55+
public <T> Description appendValueList(String start, String separator, String end, Iterable<T> values) {
56+
return appendValueList(start, separator, end, values.iterator());
57+
}
58+
59+
private <T> Description appendValueList(String start, String separator, String end, Iterator<T> values) {
60+
return appendList(start, separator, end, new SelfDescribingValueIterator<T>(values));
61+
}
62+
63+
public Description appendList(String start, String separator, String end, Iterable<? extends SelfDescribing> values) {
64+
return appendList(start, separator, end, values.iterator());
65+
}
66+
67+
private Description appendList(String start, String separator, String end, Iterator<? extends SelfDescribing> i) {
68+
boolean separate = false;
69+
append(start);
70+
while (i.hasNext()) {
71+
if (separate) append(separator);
72+
i.next().describeTo(this);
73+
separate = true;
74+
}
75+
append(end);
76+
77+
return this;
78+
}
79+
80+
81+
/** Append the <var>str</var> to the description.
82+
* The default implementation passes every character to {@link #append(char)}.
83+
* Override in subclasses to provide an efficient implementation.
84+
*/
85+
protected void append(String str) {
86+
for (int i = 0; i < str.length(); i++) {
87+
append(str.charAt(i));
88+
}
89+
}
90+
91+
protected abstract void append(char c);
92+
93+
private void toJavaSyntax(String unformatted) {
94+
append('"');
95+
for (int i = 0; i < unformatted.length(); i++) {
96+
toJavaSyntax(unformatted.charAt(i));
97+
}
98+
append('"');
99+
}
100+
101+
private void toJavaSyntax(char ch) {
102+
switch (ch) {
103+
case '"':
104+
append("\\\"");
105+
break;
106+
case '\n':
107+
append("\\n");
108+
break;
109+
case '\r':
110+
append("\\r");
111+
break;
112+
case '\t':
113+
append("\\t");
114+
break;
115+
default:
116+
append(ch);
117+
}
118+
}
119+
}

hamcrest-core/src/main/java/org/hamcrest/StringDescription.java

Lines changed: 4 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
package org.hamcrest;
22

3-
import static java.lang.String.valueOf;
4-
import java.util.Arrays;
5-
import java.util.Iterator;
63
import java.io.IOException;
74

8-
import org.hamcrest.internal.ArrayIterator;
9-
import org.hamcrest.internal.SelfDescribingValueIterator;
10-
115
/**
126
* A {@link Description} that is stored as a string.
137
*/
14-
public class StringDescription implements Description {
15-
8+
public class StringDescription extends BaseDescription {
169
private final Appendable out;
1710

1811
public StringDescription() {
@@ -44,114 +37,23 @@ public static String asString(SelfDescribing selfDescribing) {
4437
return toString(selfDescribing);
4538
}
4639

47-
public Description appendText(String text) {
48-
append(text);
49-
return this;
50-
}
51-
52-
public Description appendValue(Object value) {
53-
if (value == null) {
54-
append("null");
55-
} else if (value instanceof String) {
56-
toJavaSyntax((String) value);
57-
} else if (value instanceof Character) {
58-
append('"');
59-
toJavaSyntax((Character) value);
60-
append('"');
61-
} else if (value instanceof Short) {
62-
append('<');
63-
append(valueOf(value));
64-
append("s>");
65-
} else if (value instanceof Long) {
66-
append('<');
67-
append(valueOf(value));
68-
append("L>");
69-
} else if (value instanceof Float) {
70-
append('<');
71-
append(valueOf(value));
72-
append("F>");
73-
} else if (value.getClass().isArray()) {
74-
appendValueList("[",", ","]", new ArrayIterator(value));
75-
} else {
76-
append('<');
77-
append(valueOf(value));
78-
append('>');
79-
}
80-
return this;
81-
}
82-
83-
public <T> Description appendValueList(String start, String separator, String end, T... values) {
84-
return appendValueList(start, separator, end, Arrays.asList(values));
85-
}
86-
87-
public <T> Description appendValueList(String start, String separator, String end, Iterable<T> values) {
88-
return appendValueList(start, separator, end, values.iterator());
89-
}
90-
91-
private <T> Description appendValueList(String start, String separator, String end, Iterator<T> values) {
92-
return appendList(start, separator, end, new SelfDescribingValueIterator<T>(values));
93-
}
94-
95-
public Description appendList(String start, String separator, String end, Iterable<? extends SelfDescribing> values) {
96-
return appendList(start, separator, end, values.iterator());
97-
}
98-
99-
private Description appendList(String start, String separator, String end, Iterator<? extends SelfDescribing> i) {
100-
boolean separate = false;
101-
append(start);
102-
while (i.hasNext()) {
103-
if (separate) append(separator);
104-
i.next().describeTo(this);
105-
separate = true;
106-
}
107-
append(end);
10840

109-
return this;
110-
}
111-
112-
private void append(String str) {
41+
protected void append(String str) {
11342
try {
11443
out.append(str);
11544
} catch (IOException e) {
11645
throw new RuntimeException("Could not write description", e);
11746
}
11847
}
11948

120-
private void append(char c) {
49+
protected void append(char c) {
12150
try {
12251
out.append(c);
12352
} catch (IOException e) {
12453
throw new RuntimeException("Could not write description", e);
12554
}
12655
}
127-
128-
private void toJavaSyntax(String unformatted) {
129-
append('"');
130-
for (int i = 0; i < unformatted.length(); i++) {
131-
toJavaSyntax(unformatted.charAt(i));
132-
}
133-
append('"');
134-
}
135-
136-
private void toJavaSyntax(char ch) {
137-
switch (ch) {
138-
case '"':
139-
append("\\\"");
140-
break;
141-
case '\n':
142-
append("\\n");
143-
break;
144-
case '\r':
145-
append("\\r");
146-
break;
147-
case '\t':
148-
append("\\t");
149-
break;
150-
default:
151-
append(ch);
152-
}
153-
}
154-
56+
15557
/**
15658
* Returns the description as a string.
15759
*/

0 commit comments

Comments
 (0)