/*
* Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com]
* 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 javafx.beans;
import de.ks.LauncherRunner;
import de.ks.javafx.converter.LastValueConverter;
import javafx.beans.binding.Bindings;
import javafx.beans.property.adapter.JavaBeanIntegerProperty;
import javafx.beans.property.adapter.JavaBeanIntegerPropertyBuilder;
import javafx.beans.property.adapter.JavaBeanObjectProperty;
import javafx.beans.property.adapter.JavaBeanObjectPropertyBuilder;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.control.TextField;
import javafx.util.converter.NumberStringConverter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import static org.junit.Assert.*;
/**
*
*/
@RunWith(LauncherRunner.class)
public class PojoBindingTest {
private static final Logger log = LoggerFactory.getLogger(PojoBindingTest.class);
@Test
public void testUIPojoCommunication() throws Exception {
MyBindingPojo hello = new MyBindingPojo(1, "hello");
TextField versionInput = new TextField();
JavaBeanIntegerPropertyBuilder builder = JavaBeanIntegerPropertyBuilder.create().beanClass(MyBindingPojo.class);
builder.bean(hello);
JavaBeanIntegerProperty javaBeanIntegerProperty = builder.name("version").build();
assertEquals(1, javaBeanIntegerProperty.get());
hello.setVersion(2);
assertEquals(2, javaBeanIntegerProperty.get());
versionInput.textProperty().bindBidirectional(javaBeanIntegerProperty, new NumberStringConverter());
assertEquals("2", versionInput.getText());
hello.setVersion(3);
javaBeanIntegerProperty.fireValueChangedEvent();
assertEquals("3", versionInput.getText());
hello.setVersion(4);
javaBeanIntegerProperty.get();
assertEquals("3", versionInput.getText());
//Back communication from UI
versionInput.setText("1");
assertEquals(1, javaBeanIntegerProperty.get());
assertEquals(1, hello.getVersion());
versionInput.setText("abc");
assertEquals(0, javaBeanIntegerProperty.get());
assertEquals(0, hello.getVersion());
versionInput.textProperty().unbindBidirectional(javaBeanIntegerProperty);
versionInput.setText("5");
assertEquals(0, javaBeanIntegerProperty.get());
assertEquals(0, hello.getVersion());
versionInput.textProperty().bindBidirectional(javaBeanIntegerProperty, new LastValueConverter<>(new NumberStringConverter(), javaBeanIntegerProperty));
assertEquals(0, javaBeanIntegerProperty.get());
assertEquals(0, hello.getVersion());
assertEquals("0", versionInput.getText());
versionInput.setText("1");
assertEquals(1, javaBeanIntegerProperty.get());
assertEquals(1, hello.getVersion());
versionInput.setText("abc");
assertEquals(1, javaBeanIntegerProperty.get());
assertEquals(1, hello.getVersion());
javaBeanIntegerProperty.set(8);
assertEquals(8, hello.getVersion());
assertEquals("8", versionInput.getText());
}
@Test
public void testListTableBinding() throws Exception {
MyBindingPojo hello = new MyBindingPojo(1, "hello");
for (int i = 0; i < 10; i++) {
hello.getCollection().add(String.valueOf(i));
}
ObservableList<String> observableList = FXCollections.observableArrayList();
observableList.add("Bla");
@SuppressWarnings("unchecked") JavaBeanObjectProperty<List<String>> collection = JavaBeanObjectPropertyBuilder.create().bean(hello).name("collection").build();
collection.addListener((observable, oldValue, newValue) -> {
log.info("Oldvalue ={}", oldValue);
log.info("Oldvalue ={}", newValue);
});
observableList.addListener((ListChangeListener<String>) c -> {
while (c.next()) {
log.info("Added to 'observableList' {}", c.getAddedSubList());
log.info("Removed from 'observableList' {}", c.getRemoved());
}
});
ObservableList<String> wrappedObservable = FXCollections.observableList(collection.get());
wrappedObservable.addListener((ListChangeListener<String>) c -> {
while (c.next()) {
log.info("Added to 'wrappedObservable' {}", c.getAddedSubList());
log.info("Removed from 'wrappedObservable' {}", c.getRemoved());
}
});
Bindings.bindContentBidirectional(observableList, wrappedObservable);
log.info("Adding to wrapped collection");
wrappedObservable.add("Hello");
assertTrue(hello.getCollection().contains("Hello"));
log.info("Removing from wrapped collection");
wrappedObservable.remove("Hello");
assertFalse(hello.getCollection().contains("Hello"));
log.info("Adding to observableList");
observableList.add("Hello");
assertTrue(hello.getCollection().contains("Hello"));
log.info("Removing from observableList");
observableList.remove("Hello");
assertFalse(hello.getCollection().contains("Hello"));
}
}