/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.ajax4jsf.javascript;
import junit.framework.TestCase;
import org.easymock.IArgumentMatcher;
import org.jboss.test.faces.mock.MockFacesEnvironment;
import javax.faces.context.ResponseWriter;
import java.io.Writer;
import java.lang.reflect.Array;
import java.util.Random;
import static org.easymock.EasyMock.aryEq;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.isNull;
import static org.easymock.EasyMock.reportMatcher;
/**
* @author Nick Belaevski
* @since 3.3.2
*/
public class ResponseWriterWrapperTest extends TestCase {
private MockFacesEnvironment facesEnvironment;
private ResponseWriter mockWriter;
private Writer writer;
@Override
protected void setUp() throws Exception {
super.setUp();
facesEnvironment = MockFacesEnvironment.createEnvironment();
mockWriter = facesEnvironment.createMock(ResponseWriter.class);
writer = new ResponseWriterWrapper(mockWriter);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
facesEnvironment.verify();
facesEnvironment.release();
facesEnvironment = null;
this.writer = null;
this.mockWriter = null;
}
public void testWrite1() throws Exception {
char[] cs = new char[] { 'a', 'b' };
mockWriter.writeText(cs, 0, 2);
facesEnvironment.replay();
writer.write(cs);
}
private static char[] expectSingleChar(final char c) {
reportMatcher(new IArgumentMatcher() {
private String failureMessage;
public void appendTo(StringBuffer sb) {
sb.append(failureMessage);
}
public boolean matches(Object o) {
if (!(o instanceof char[])) {
failureMessage = "Array of chars expected as argument";
} else {
if (Array.getLength(o) == 0) {
failureMessage = "Array should be of non-zero length";
} else {
if (Array.getChar(o, 0) != c) {
failureMessage = "[" + c + "] expected as [0] char";
}
}
}
return failureMessage == null;
}
});
return null;
}
private static char[] expectFirstChars(final char[] cs) {
return expectFirstChars(cs, cs.length);
}
private static char[] expectFirstChars(final char[] cs, final int length) {
reportMatcher(new IArgumentMatcher() {
private String failureMessage;
public void appendTo(StringBuffer sb) {
sb.append(failureMessage);
}
public boolean matches(Object o) {
if (!(o instanceof char[])) {
failureMessage = "Array of chars expected as argument";
} else {
char[] argChars = (char[]) o;
if (argChars.length < length) {
failureMessage = "Array should have minimum " + length + " length, but has only: " + argChars.length;
} else {
for (int i = 0; i < length; i++) {
if (argChars[i] != cs[i]) {
failureMessage = "Char at offset [" + i + "] mismath: expected " + cs[i] + " but was "
+ argChars[i];
break;
}
}
}
}
return failureMessage == null;
}
});
return null;
}
public void testWrite2() throws Exception {
mockWriter.writeText(expectSingleChar((char) 0x5678), eq(0), eq(1));
mockWriter.writeText(expectSingleChar((char) 0xBA98), eq(0), eq(1));
facesEnvironment.replay();
writer.write(0x12345678);
writer.write(0xFECDBA98);
}
public void testWrite3() throws Exception {
mockWriter.writeText(eq("test"), (String) isNull());
facesEnvironment.replay();
writer.write("test");
}
public void testWrite4() throws Exception {
mockWriter.writeText(aryEq("abcd".toCharArray()), eq(1), eq(2));
mockWriter.writeText(aryEq("efgh".toCharArray()), eq(0), eq(3));
mockWriter.writeText(aryEq("ijklm".toCharArray()), eq(2), eq(3));
facesEnvironment.replay();
writer.write("abcd".toCharArray(), 1, 2);
writer.write("efgh".toCharArray(), 0, 3);
writer.write("ijklm".toCharArray(), 2, 3);
}
public void testWrite5() throws Exception {
mockWriter.writeText(expectFirstChars("string to".toCharArray()), eq(0), eq(9));
mockWriter.writeText(expectFirstChars("one".toCharArray()), eq(0), eq(3));
facesEnvironment.replay();
writer.write("string to test", 0, 9);
writer.write("short one", 6, 3);
}
public void testWrite6() throws Exception {
char[] cs = new char[4098];
int length = cs.length - 2;
for (int i = 0; i < cs.length; i++) {
cs[i] = (char) new Random().nextInt(Character.MAX_VALUE + 1);
}
mockWriter.writeText(expectFirstChars(cs, length), eq(0), eq(length));
facesEnvironment.replay();
writer.write(String.valueOf(cs), 0, length);
}
public void testFlush() throws Exception {
mockWriter.flush();
facesEnvironment.replay();
writer.flush();
}
public void testClose() throws Exception {
mockWriter.close();
facesEnvironment.replay();
writer.close();
}
}