/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.wicket;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import java.util.MissingResourceException;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.resource.DummyApplication;
import org.apache.wicket.resource.loader.ComponentStringResourceLoader;
import org.apache.wicket.settings.ResourceSettings;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.util.tester.WicketTester;
import org.apache.wicket.util.value.ValueMap;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Test cases for the <code>Localizer</code> class.
*
* @author Chris Turner
*/
public class LocalizerTest extends Assert
{
private static class MyMockPage extends WebPage
{
private static final long serialVersionUID = 1L;
DropDownChoice<String> drop1;
DropDownChoice<String> drop2;
/**
* Construct.
*/
public MyMockPage()
{
final Form<Void> form = new Form<Void>("form");
add(form);
String[] choices = { "choice1", "choice2" };
drop1 = new DropDownChoice<String>("drop1", Arrays.asList(choices));
drop2 = new DropDownChoice<String>("drop2", Arrays.asList(choices));
form.add(drop1);
form.add(drop2);
}
}
private WicketTester tester;
private ResourceSettings settings;
protected Localizer localizer;
/**
*
* @throws Exception
*/
@Before
public void setUp() throws Exception
{
tester = new WicketTester(new DummyApplication());
settings = tester.getApplication().getResourceSettings();
localizer = tester.getApplication().getResourceSettings().getLocalizer();
}
@After
public void tearDown() throws Exception
{
tester.destroy();
}
/**
*
*/
@Test
public void testGetStringValidString()
{
Assert.assertEquals("Expected string should be returned", "This is a test",
localizer.getString("test.string", null, null, "DEFAULT"));
}
/**
*
*/
@Test
public void testGetStringMissingStringReturnDefault()
{
settings.setUseDefaultOnMissingResource(true);
Assert.assertEquals("Default string should be returned", "DEFAULT",
localizer.getString("unknown.string", null, null, "DEFAULT"));
}
/**
*
*/
@Test
public void testGetStringMissingStringNoDefault()
{
settings.setUseDefaultOnMissingResource(true);
settings.setThrowExceptionOnMissingResource(false);
Assert.assertEquals("Wrapped key should be returned on no default",
"[Warning: Property for 'unknown.string' not found]",
localizer.getString("unknown.string", null, null, null));
}
/**
*
*/
@Test
public void testGetStringMissingStringDoNotUseDefault()
{
settings.setUseDefaultOnMissingResource(false);
settings.setThrowExceptionOnMissingResource(false);
Assert.assertEquals("Wrapped key should be returned on not using default and no exception",
"[Warning: Property for 'unknown.string' not found]",
localizer.getString("unknown.string", null, null, "DEFAULT"));
}
/**
*
*/
@Test
public void testGetStringMissingStringExceptionThrown()
{
settings.setUseDefaultOnMissingResource(false);
settings.setThrowExceptionOnMissingResource(true);
try
{
localizer.getString("unknown.string", null, null, "DEFAULT");
Assert.fail("MissingResourceException expected");
}
catch (MissingResourceException e)
{
// Expected result
}
}
/**
*
*/
@Test
public void testGetStringPropertySubstitution()
{
Session.get().setLocale(Locale.GERMAN);
ValueMap vm = new ValueMap();
vm.put("user", "John Doe");
vm.put("rating", 4.5);
IModel<ValueMap> model = new Model<ValueMap>(vm);
Assert.assertEquals("Property substitution should occur", "John Doe gives 4,5 stars",
localizer.getString("test.substitute", null, model, null));
}
/**
*
*/
@Test
public void testInComponentConstructor()
{
new MyLabel("myLabel");
}
/**
* Unit test for bug number [1416582] Resource loading caches wrong.
*/
@Test
public void testTwoComponents()
{
Session.get().setLocale(Locale.ENGLISH);
MyMockPage page = new MyMockPage();
Application.get()
.getResourceSettings()
.getStringResourceLoaders()
.add(new ComponentStringResourceLoader());
Localizer localizer = Application.get().getResourceSettings().getLocalizer();
assertEquals("value 1", localizer.getString("null", page.drop1));
assertEquals("value 2", localizer.getString("null", page.drop2));
Session.get().setLocale(new Locale("nl"));
assertEquals("waarde 1", localizer.getString("null", page.drop1));
assertEquals("waarde 2", localizer.getString("null", page.drop2));
}
/**
*
*/
@Test
public void testGetStringUseModel()
{
Session.get().setLocale(Locale.GERMAN);
HashMap<String, Object> model = new HashMap<String, Object>();
model.put("user", "juergen");
model.put("rating", 4.5);
Assert.assertEquals("Expected string should be returned", "juergen gives 4,5 stars",
localizer.getString("test.substitute", null, new PropertyModel<String>(model, null),
"DEFAULT {user}"));
Assert.assertEquals("Expected string should be returned", "DEFAULT juergen",
localizer.getString("test.substituteDoesNotExist", null,
new PropertyModel<HashMap<String, Object>>(model, null), "DEFAULT ${user}"));
}
/**
* See https://issues.apache.org/jira/browse/WICKET-1851
*/
@Test
public void test_1851_1()
{
MyMockPage page = new MyMockPage();
tester.getApplication().getResourceSettings().setThrowExceptionOnMissingResource(false);
tester.getApplication().getResourceSettings().setUseDefaultOnMissingResource(false);
String option = localizer.getStringIgnoreSettings("dummy.null", page.drop1, null, "default");
assertEquals("default", option);
option = localizer.getStringIgnoreSettings("dummy.null", page.drop1, null, null);
assertNull(option);
if (Strings.isEmpty(option))
{
option = localizer.getString("null", page.drop1, "CHOOSE_ONE");
}
assertEquals("value 1", option);
tester.getApplication().getResourceSettings().setThrowExceptionOnMissingResource(false);
tester.getApplication().getResourceSettings().setUseDefaultOnMissingResource(false);
option = localizer.getString("dummy.null", page.drop1, null, "default");
assertEquals(option, "[Warning: Property for 'dummy.null' not found]");
tester.getApplication().getResourceSettings().setThrowExceptionOnMissingResource(true);
tester.getApplication().getResourceSettings().setUseDefaultOnMissingResource(true);
option = localizer.getString("dummy.null", page.drop1, null, "default");
assertEquals("default", option);
try
{
localizer.getString("dummy.null", page.drop1, null, null);
assertTrue("Expected an exception to happen", false);
}
catch (MissingResourceException ex)
{
assertEquals(
"Unable to find property: 'dummy.null' for component: form:drop1 [class=org.apache.wicket.markup.html.form.DropDownChoice]. Locale: null, style: null",
ex.getMessage());
}
}
/**
* Test label.
*/
public static class MyLabel extends Label
{
private static final long serialVersionUID = 1L;
/**
* Construct.
*
* @param id
*/
public MyLabel(final String id)
{
super(id);
Localizer localizer = Application.get().getResourceSettings().getLocalizer();
// should work properly in a component constructor (without parent)
// as well
Assert.assertEquals("Expected string should be returned", "This is a test",
localizer.getString("test.string", this, "DEFAULT"));
}
}
}