blob: 9f922e58d077e5d4a75461f04110567602d77e47 [file] [log] [blame]
/*
* 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 static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
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.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/**
* Test cases for the <code>Localizer</code> class.
*
* @author Chris Turner
*/
class LocalizerTest
{
Localizer localizer;
private WicketTester tester;
private ResourceSettings settings;
/**
*
* @throws Exception
*/
@BeforeEach
void setUp() throws Exception
{
tester = new WicketTester(new DummyApplication());
settings = tester.getApplication().getResourceSettings();
localizer = tester.getApplication().getResourceSettings().getLocalizer();
}
@AfterEach
void tearDown() throws Exception
{
tester.destroy();
}
/**
*
*/
@Test
void testGetStringValidString()
{
assertEquals("This is a test", localizer.getString("test.string", null, null, "DEFAULT"),
"Expected string should be returned");
}
/**
*
*/
@Test
void testGetStringMissingStringReturnDefault()
{
settings.setUseDefaultOnMissingResource(true);
assertEquals("DEFAULT", localizer.getString("unknown.string", null, null, "DEFAULT"),
"Default string should be returned");
}
/**
*
*/
@Test
void testGetStringMissingStringNoDefault()
{
settings.setUseDefaultOnMissingResource(true);
settings.setThrowExceptionOnMissingResource(false);
assertEquals("[Warning: Property for 'unknown.string' not found]",
localizer.getString("unknown.string", null, null, null),
"Wrapped key should be returned on no default");
}
/**
*
*/
@Test
void testGetStringMissingStringDoNotUseDefault()
{
settings.setUseDefaultOnMissingResource(false);
settings.setThrowExceptionOnMissingResource(false);
assertEquals("[Warning: Property for 'unknown.string' not found]",
localizer.getString("unknown.string", null, null, "DEFAULT"),
"Wrapped key should be returned on not using default and no exception");
}
/**
*
*/
@Test
void testGetStringMissingStringExceptionThrown()
{
settings.setUseDefaultOnMissingResource(false);
settings.setThrowExceptionOnMissingResource(true);
try
{
localizer.getString("unknown.string", null, null, "DEFAULT");
fail("MissingResourceException expected");
}
catch (MissingResourceException e)
{
// Expected result
}
}
/**
*
*/
@Test
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);
assertEquals("John Doe gives 4,5 stars",
localizer.getString("test.substitute", null, model, null),
"Property substitution should occur");
}
/**
*
*/
@Test
void testInComponentConstructor()
{
new MyLabel("myLabel");
}
/**
* Unit test for bug number [1416582] Resource loading caches wrong.
*/
@Test
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
void testGetStringUseModel()
{
Session.get().setLocale(Locale.GERMAN);
HashMap<String, Object> model = new HashMap<String, Object>();
model.put("user", "juergen");
model.put("rating", 4.5);
assertEquals(
"juergen gives 4,5 stars", localizer.getString("test.substitute", null,
new PropertyModel<String>(model, null), "DEFAULT {user}"),
"Expected string should be returned");
assertEquals("DEFAULT juergen",
localizer.getString("test.substituteDoesNotExist", null,
new PropertyModel<HashMap<String, Object>>(model, null), "DEFAULT ${user}"),
"Expected string should be returned");
}
/**
* See https://issues.apache.org/jira/browse/WICKET-1851
*/
@Test
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(false, "Expected an exception to happen");
}
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());
}
}
public static class MyMockPage extends WebPage
{
private static final long serialVersionUID = 1L;
DropDownChoice<String> drop1;
DropDownChoice<String> drop2;
/**
* Construct.
*/
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);
}
}
/**
* Test label.
*/
public static class MyLabel extends Label
{
private static final long serialVersionUID = 1L;
/**
* Construct.
*
* @param id
*/
MyLabel(final String id)
{
super(id);
Localizer localizer = Application.get().getResourceSettings().getLocalizer();
// should work properly in a component constructor (without parent)
// as well
assertEquals("This is a test",
localizer.getString("test.string", this, "DEFAULT"), "Expected string should be returned");
}
}
}