/*
* Copyright 2008 Google Inc.
*
* 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 com.google.gwt.inject.rebind.binding;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import com.google.gwt.inject.rebind.reflect.NoSourceNameException;
import com.google.gwt.inject.rebind.util.InjectorMethod;
import com.google.gwt.inject.rebind.util.InjectorWriteContext;
import com.google.inject.Key;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.List;
public class BindConstantBindingTest extends TestCase {
private static final String SOURCE = "dummy";
private static final Context CONTEXT = Context.forText(SOURCE);
// TODO(schmitt): Add tests for other constant types.
public void testEnum() throws NoSourceNameException {
Key<Color> colorKey = Key.get(Color.class);
BindConstantBinding<Color> binding =
new BindConstantBinding<Color>(colorKey, Color.Green, CONTEXT);
assertEquals(1, binding.getDependencies().size());
// This doesn't actually check that the source is passed along, due to
// dependency sources being excluded from equals().
assertTrue(binding.getDependencies().contains(
new Dependency(Dependency.GINJECTOR, colorKey, SOURCE)));
assertCreationStatements(binding, "com.google.gwt.inject.rebind.binding.Color result ="
+ " com.google.gwt.inject.rebind.binding.Color.Green;");
}
public void testInnerEnum() throws NoSourceNameException {
Key<Font> fontKey = Key.get(Font.class);
BindConstantBinding<Font> binding =
new BindConstantBinding<Font>(fontKey, Font.Verdana, CONTEXT);
assertCreationStatements(binding,
"com.google.gwt.inject.rebind.binding.BindConstantBindingTest.Font result "
+ "= com.google.gwt.inject.rebind.binding.BindConstantBindingTest.Font.Verdana;");
}
public void testInnerEnumWithCustomImplementation() throws NoSourceNameException {
Key<Font> fontKey = Key.get(Font.class);
BindConstantBinding<Font> binding =
new BindConstantBinding<Font>(fontKey, Font.Arial, CONTEXT);
assertCreationStatements(binding,
"com.google.gwt.inject.rebind.binding.BindConstantBindingTest.Font result "
+ "= com.google.gwt.inject.rebind.binding.BindConstantBindingTest.Font.Arial;");
}
public void testCharacter() throws NoSourceNameException {
Key<Character> charKey = Key.get(Character.class);
char value = '\u1234';
BindConstantBinding<Character> binding =
new BindConstantBinding<Character>(charKey, value, CONTEXT);
assertEquals(1, binding.getDependencies().size());
// This doesn't actually check that the source is passed along, due to
// dependency sources being excluded from equals().
assertTrue(binding.getDependencies().contains(
new Dependency(Dependency.GINJECTOR, charKey, SOURCE)));
assertCreationStatements(binding, "java.lang.Character result = '" + value + "';");
}
public void testCharacterEscaped() throws NoSourceNameException {
Key<Character> charKey = Key.get(Character.class);
char value = '\'';
BindConstantBinding<Character> binding =
new BindConstantBinding<Character>(charKey, value, CONTEXT);
assertEquals(1, binding.getDependencies().size());
// This doesn't actually check that the source is passed along, due to
// dependency sources being excluded from equals().
assertTrue(binding.getDependencies().contains(
new Dependency(Dependency.GINJECTOR, charKey, SOURCE)));
assertCreationStatements(binding, "java.lang.Character result = '\\'';");
}
/**
* Verifies that invoking binding.getCreationStatements() produces no helper
* methods, does not invoke any methods on the write context, and produces the
* given statements.
*/
private void assertCreationStatements(Binding binding, String expectedStatements)
throws NoSourceNameException {
InjectorWriteContext writeContextMock = createMock(InjectorWriteContext.class);
replay(writeContextMock);
List<InjectorMethod> methods = new ArrayList<InjectorMethod>();
String actualStatements =
binding.getCreationStatements(null, methods).getSource(writeContextMock);
assertEquals(expectedStatements, actualStatements);
assertEquals(0, methods.size());
verify(writeContextMock);
}
public enum Font {
Arial {
@Override public Font getAlternative() {
return Verdana;
}},
Verdana,
TimesNewRoman;
public Font getAlternative() {
return this;
}
}
}