/*
* Copyright 2000-2016 Vaadin Ltd.
*
* 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.vaadin.data;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Before;
import org.junit.Test;
import com.vaadin.tests.data.bean.BeanWithEnums;
import com.vaadin.tests.data.bean.TestEnum;
import com.vaadin.ui.CheckBoxGroup;
public class BinderMultiSelectTest
extends BinderTestBase<Binder<BeanWithEnums>, BeanWithEnums> {
public static class TestEnumSetToStringConverter
implements Converter<Set<TestEnum>, String> {
@Override
public Result<String> convertToModel(Set<TestEnum> value,
ValueContext context) {
return Result.ok(value.stream().map(TestEnum::name)
.collect(Collectors.joining(",")));
}
@Override
public Set<TestEnum> convertToPresentation(String value,
ValueContext context) {
return Stream.of(value.split(","))
.filter(string -> !string.isEmpty()).map(TestEnum::valueOf)
.collect(Collectors.toSet());
}
}
private final Binder<AtomicReference<String>> converterBinder = new Binder<>();
private CheckBoxGroup<TestEnum> select;
@Before
public void setUp() {
binder = new Binder<>();
item = new BeanWithEnums();
select = new CheckBoxGroup<>();
select.setItems(TestEnum.values());
converterBinder.forField(select)
.withConverter(new TestEnumSetToStringConverter())
.bind(AtomicReference::get, AtomicReference::set);
}
@Test
public void beanBound_bindSelectByShortcut_selectionUpdated() {
item.setEnums(Collections.singleton(TestEnum.ONE));
binder.setBean(item);
binder.bind(select, BeanWithEnums::getEnums, BeanWithEnums::setEnums);
assertEquals(Collections.singleton(TestEnum.ONE),
select.getSelectedItems());
}
@Test
public void beanBound_bindSelect_selectionUpdated() {
item.setEnums(Collections.singleton(TestEnum.TWO));
binder.setBean(item);
binder.forField(select).bind(BeanWithEnums::getEnums,
BeanWithEnums::setEnums);
assertEquals(Collections.singleton(TestEnum.TWO),
select.getSelectedItems());
}
@Test
public void selectBound_bindBeanWithoutEnums_selectedItemNotPresent() {
bindEnum();
assertTrue(select.getSelectedItems().isEmpty());
}
@Test
public void selectBound_bindBean_selectionUpdated() {
item.setEnums(Collections.singleton(TestEnum.ONE));
bindEnum();
assertEquals(Collections.singleton(TestEnum.ONE),
select.getSelectedItems());
}
@Test
public void bound_setSelection_beanValueUpdated() {
bindEnum();
select.select(TestEnum.TWO);
assertEquals(Collections.singleton(TestEnum.TWO), item.getEnums());
}
@Test
public void bound_setSelection_beanValueIsACopy() {
bindEnum();
select.select(TestEnum.TWO);
Set<TestEnum> enums = item.getEnums();
binder.setBean(new BeanWithEnums());
select.select(TestEnum.ONE);
assertEquals(Collections.singleton(TestEnum.TWO), enums);
}
@Test
public void bound_deselect_beanValueUpdatedToNull() {
item.setEnums(Collections.singleton(TestEnum.ONE));
bindEnum();
select.deselect(TestEnum.ONE);
assertTrue(item.getEnums().isEmpty());
}
@Test
public void unbound_changeSelection_beanValueNotUpdated() {
item.setEnums(Collections.singleton(TestEnum.ONE));
bindEnum();
binder.removeBean();
select.select(TestEnum.TWO);
assertEquals(Collections.singleton(TestEnum.ONE), item.getEnums());
}
@Test
public void withConverter_load_selectUpdated() {
converterBinder.readBean(new AtomicReference<>("TWO"));
assertEquals(Collections.singleton(TestEnum.TWO),
select.getSelectedItems());
}
@Test
public void withConverter_save_referenceUpdated() {
select.select(TestEnum.ONE);
select.select(TestEnum.TWO);
AtomicReference<String> reference = new AtomicReference<>("");
converterBinder.writeBeanIfValid(reference);
assertEquals("ONE,TWO", reference.get());
}
@Test
public void withValidator_validate_validatorUsed() {
binder.forField(select)
.withValidator(selection -> selection.size() % 2 == 1,
"Must select odd number of items")
.bind(BeanWithEnums::getEnums, BeanWithEnums::setEnums);
binder.setBean(item);
assertFalse(binder.validate().isOk());
select.select(TestEnum.TWO);
assertTrue(binder.validate().isOk());
}
protected void bindEnum() {
binder.forField(select).bind(BeanWithEnums::getEnums,
BeanWithEnums::setEnums);
binder.setBean(item);
}
}