blob: 0af4f04048e6ce73a17473da240c059d39a96647 [file] [log] [blame]
/**
* Copyright 2006-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.objenesis.tck;
import static org.junit.Assert.*;
import java.util.Map;
import org.junit.Test;
import org.objenesis.Objenesis;
import org.objenesis.instantiator.ObjectInstantiator;
/**
* @author Joe Walnes
* @author Henri Tremblay
*/
public class TCKTest {
public static class StubbedInstantiator1 implements Objenesis {
public <T> T newInstance(Class<T> clazz) {
return null;
}
public <T> ObjectInstantiator<T> getInstantiatorOf(Class<T> clazz) {
return null;
}
}
public static class StubbedInstantiator2 implements Objenesis {
public <T> T newInstance(Class<T> clazz) {
return null;
}
public <T> ObjectInstantiator<T> getInstantiatorOf(Class<T> clazz) {
return null;
}
}
@Test
public void testReportsAllCandidatesAndInstantiatorCombinationsToReporter() {
// Given... a TCK with some candidate classes: A, B and C.
TCK tck = new TCK();
tck.registerCandidate(CandidateA.class, "Candidate A");
tck.registerCandidate(CandidateB.class, "Candidate B");
tck.registerCandidate(CandidateC.class, "Candidate C");
// And... two ObjectInstantiators registered
tck.registerObjenesisInstance(new StubbedInstantiator1(), "Instantiator1");
tck.registerObjenesisInstance(new StubbedInstantiator2(), "Instantiator2");
// When... the TCK tests are run
Reporter reporter = new RecordingReporter();
tck.runTests(reporter);
// Expect... the reporter to have received a sequence of calls
// notifying it of what the TCK is doing.
assertEquals("" + "startTests()\n" + "startTest('Candidate A', 'Instantiator1')\n"
+ "result(false)\n" + "endTest()\n" + "startTest('Candidate A', 'Instantiator2')\n"
+ "result(false)\n" + "endTest()\n" + "startTest('Candidate B', 'Instantiator1')\n"
+ "result(false)\n" + "endTest()\n" + "startTest('Candidate B', 'Instantiator2')\n"
+ "result(false)\n" + "endTest()\n" + "startTest('Candidate C', 'Instantiator1')\n"
+ "result(false)\n" + "endTest()\n" + "startTest('Candidate C', 'Instantiator2')\n"
+ "result(false)\n" + "endTest()\n" + "endTests()\n", reporter.toString());
}
@Test
public void testReportsSuccessIfCandidateCanBeInstantiated() {
// Given... a TCK with some candidate classes: A, B and C.
TCK tck = new TCK();
tck.registerCandidate(CandidateA.class, "Candidate A");
tck.registerCandidate(CandidateB.class, "Candidate B");
// And... a single ObjectInsantiator registered that can instantiate
// A but not B.
tck.registerObjenesisInstance(new SelectiveInstantiator(), "instantiator");
// When... the TCK tests are run
Reporter reporter = new RecordingReporter();
tck.runTests(reporter);
// Expect... the reporter to be notified that A succeeded
// but B failed.
assertEquals("" + "startTests()\n" + "startTest('Candidate A', 'instantiator')\n" + // A
"result(true)\n" + // true
"endTest()\n" + "startTest('Candidate B', 'instantiator')\n" + // B
"result(false)\n" + // false
"endTest()\n" + "endTests()\n", reporter.toString());
}
// Some sample classes used for testing.
public static class SelectiveInstantiator implements Objenesis {
public <T> T newInstance(Class<T> clazz) {
return clazz.cast(clazz == CandidateA.class ? new CandidateA() : null);
}
public <T> ObjectInstantiator<T> getInstantiatorOf(Class<T> clazz) {
return null;
}
}
public static class CandidateA {
}
public static class CandidateB {
}
public static class CandidateC {
}
/**
* A poor man's mock. Using a recording test double to verify interactions between the TCK and
* the Recorder. <p/> Note: This test case could be simplified by using a mock object library.
* However, I wanted to simplify dependencies - particularly as in the future, the mock libraries
* may depend on objenesis - getting into an awkward cyclical dependency situation. -Joe.
*/
private static class RecordingReporter implements Reporter {
private final StringBuilder log = new StringBuilder();
public void startTests(String platformDescription, Map<String, Object> allCandidates,
Map<String, Object> allInstantiators) {
log.append("startTests()\n");
}
public void startTest(String candidateDescription, String objenesisDescription) {
log.append("startTest('").append(candidateDescription).append("', '").append(
objenesisDescription).append("')\n");
}
public void result(boolean instantiatedObject) {
log.append("result(").append(instantiatedObject).append(")\n");
}
public void exception(Exception exception) {
log.append("exception()\n");
}
public void endTest() {
log.append("endTest()\n");
}
public void endTests() {
log.append("endTests()\n");
}
@Override
public String toString() {
return log.toString();
}
}
}