package org.javabuilders.swing.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import org.javabuilders.BuildResult;
import org.javabuilders.event.IBindingListener;
import org.javabuilders.swing.SwingJavaBuilder;
import org.javabuilders.swing.test.issues.resources.BindingPanel;
import org.javabuilders.swing.test.issues.resources.Book;
import org.javabuilders.swing.test.resources.Author;
import org.javabuilders.swing.test.resources.AuthorsPanel;
import org.javabuilders.swing.test.resources.BooksPanel;
import org.javabuilders.swing.util.SwingYamlBuilder;
import org.jdesktop.beansbinding.AutoBinding.UpdateStrategy;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.Binding;
import org.jdesktop.swingbinding.JComboBoxBinding;
import org.jdesktop.swingbinding.JListBinding;
import org.jdesktop.swingbinding.JTableBinding;
import org.jdesktop.swingbinding.SwingBindings;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
/**
* Data binding tests
*/
public class DataBindingTest {
private List<Book> books = new LinkedList<Book>();
@Before
public void setup() {
Book book1 = new Book("Charles Darwin","The Origin of Species",14.99);
books.add(book1);
Book book2 = new Book("Carl Sagan","Cosmos",8.99);
books.add(book2);
}
@After
public void teardown() {
books.clear();
}
@Test
public void testJComboBoxBeansBinding() {
JComboBox box = new JComboBox();
@SuppressWarnings("rawtypes")
JComboBoxBinding binding = SwingBindings.createJComboBoxBinding(UpdateStrategy.READ_WRITE,
books, box);
binding.bind();
assertEquals(books.size(),box.getItemCount());
assertEquals("Charles Darwin: The Origin of Species", box.getItemAt(0).toString());
assertEquals("Carl Sagan: Cosmos", box.getItemAt(1).toString());
}
@Test
public void testJComboBoxModel() {
BooksPanel panel = new BooksPanel();
panel.setBooks(books);
BuildResult r = new SwingYamlBuilder("JPanel:") {{
___("- JComboBox(name=box)");
bind();
___("- box.model: this.books");
}}.build(panel);
JComboBox box = (JComboBox) r.get("box");
assertNotNull(box);
assertEquals(books.size(),panel.getBooks().size());
assertEquals(books.size(),box.getItemCount());
assertEquals("Charles Darwin: The Origin of Species", box.getItemAt(0).toString());
assertEquals("Carl Sagan: Cosmos", box.getItemAt(1).toString());
}
@Test
public void testJListBeansBinding() {
JList list = new JList();
JListBinding<Book, ?, ?> binding = SwingBindings.createJListBinding(UpdateStrategy.READ_WRITE, books, list);
binding.bind();
assertEquals(books.size(),list.getModel().getSize());
assertEquals("Charles Darwin: The Origin of Species", list.getModel().getElementAt(0).toString());
assertEquals("Carl Sagan: Cosmos", list.getModel().getElementAt(1).toString());
}
@Test
public void testJListModel() {
BooksPanel panel = new BooksPanel();
panel.setBooks(books);
BuildResult r = new SwingYamlBuilder("JPanel:") {{
___("- JList(name=list)");
bind();
___("- list.model: this.books");
}}.build(panel);
JList list = (JList) r.get("list");
assertNotNull(list);
assertEquals(books.size(),panel.getBooks().size());
assertEquals(books.size(),list.getModel().getSize());
assertEquals("Charles Darwin: The Origin of Species", list.getModel().getElementAt(0).toString());
assertEquals("Carl Sagan: Cosmos", list.getModel().getElementAt(1).toString());
}
@Test @Ignore
public void testJListNestedModel() {
AuthorsPanel panel = new AuthorsPanel();
JList authors = (JList) panel.result.get("authors");
assertNotNull(authors);
JList books = (JList) panel.result.get("books");
assertNotNull(books);
JTextField firstName = (JTextField) panel.result.get("firstName");
assertNotNull(firstName);
JTextField lastName = (JTextField) panel.result.get("lastName");
assertNotNull(lastName);
JTextField bookTitle = (JTextField) panel.result.get("bookTitle");
assertNotNull(bookTitle);
List<Author> list = panel.getAuthors();
assertEquals(list.size(), authors.getModel().getSize());
for(Author author : list) {
authors.setSelectedValue(author, true);
assertEquals(author, authors.getSelectedValue());
assertEquals(author.getFirstName(),firstName.getText());
assertEquals(author.getLastName(),lastName.getText());
List<Book> authorBooks = author.getBooks();
assertEquals(authorBooks.size(), books.getModel().getSize());
for(Book book : authorBooks) {
books.setSelectedValue(book,true);
assertEquals(book.getTitle(), bookTitle.getText());
}
}
}
@SuppressWarnings("unchecked")
@Test
public void testJTableBeansBinding() {
BooksPanel panel = new BooksPanel();
panel.setBooks(books);
BuildResult r = new SwingYamlBuilder("JPanel:") {{
___("- JTable(name=table)");
}}.build(panel);
JTable table = (JTable) r.get("table");
assertNotNull(table);
TableModel model = table.getModel();
//create columns
TableColumn col = new TableColumn(0);
col.setHeaderValue("Author Column");
table.getColumnModel().addColumn(col);
@SuppressWarnings("rawtypes")
JTableBinding bind = SwingBindings.createJTableBinding(UpdateStrategy.READ_WRITE, books, table);
bind.addColumnBinding(0, BeanProperty.create("author")).setColumnClass(String.class).setEditable(true);
bind.addColumnBinding(1, BeanProperty.create("title")).setColumnClass(String.class).setEditable(true);
bind.addColumnBinding(2, BeanProperty.create("price")).setColumnClass(double.class).setEditable(true);
bind.bind();
assertEquals(books.size(), table.getRowCount());
assertEquals(3, table.getColumnCount());
//check values
for(int i = 0; i < table.getRowCount();i++) {
Book book = books.get(i);
assertEquals(book.getAuthor(), table.getValueAt(i, 0));
assertEquals(book.getTitle(), table.getValueAt(i, 1));
assertEquals(book.getPrice(), table.getValueAt(i, 2));
}
//BB overrides the default model
assertFalse(model.equals(table.getModel()));
//BB overrides the table column
assertFalse("Author Column".equals(table.getColumnModel().getColumn(0).getHeaderValue()));
}
@Test @Ignore
public void testJTableModel() {
BooksPanel panel = new BooksPanel();
panel.setBooks(books);
@SuppressWarnings("unused")
BuildResult r = new SwingYamlBuilder("JPanel:") {{
___("- JTable(name=list)");
bind();
___("- list.model: this.books(author,title,price)");
}}.build(panel);
}
@SuppressWarnings("unchecked")
@Test
public void testPOJOBinding() throws InterruptedException {
@SuppressWarnings("rawtypes")
IBindingListener listener = null;
final AtomicInteger counter = new AtomicInteger(0);
try {
listener = new IBindingListener<Binding<? extends Object,? extends Object,? extends Object,? extends Object>>() {
@Override
public void bindingCreated(BuildResult result,
Binding<? extends Object, ? extends Object, ? extends Object, ? extends Object> binding) {
counter.incrementAndGet();
}
};
SwingJavaBuilder.getConfig().addBindingListener(
new IBindingListener<Binding<? extends Object,? extends Object,? extends Object,? extends Object>>() {
@Override
public void bindingCreated(BuildResult result,
Binding<? extends Object, ? extends Object, ? extends Object, ? extends Object> binding) {
counter.incrementAndGet();
}
});
BindingPanel p = new BindingPanel();
//test from UI to POJO
p.author.setText("Charles Darwin");
assertEquals("Charles Darwin", p.getBook().getAuthor());
p.title.setText("The Origin of Species");
assertEquals("The Origin of Species", p.getBook().getTitle());
p.price.setText("12.99");
assertEquals(12.99, p.getBook().getPrice(),0);
//test from POJO to UI - need to sleep after each setter to give events time to fire
//asynchronously
p.getBook().setAuthor("Carl Sagan");
Thread.sleep(100);
assertEquals("Carl Sagan", p.author.getText());
p.getBook().setTitle("Cosmos");
Thread.sleep(100);
assertEquals("Cosmos", p.title.getText());
p.getBook().setPrice(5.99);
Thread.sleep(100);
assertEquals("5.99", p.price.getText());
//change whole book in one shot
Book book = new Book("Stanislaw Lem","Przygody pilota Pirxa",9.99);
p.setBook(book);
Thread.sleep(100);
assertEquals("Stanislaw Lem", p.author.getText());
assertEquals("Przygody pilota Pirxa", p.title.getText());
assertEquals("9.99", p.price.getText());
//test from UI to POJO with synthetic BBB properties (issue 139)
//since ON_FOCUS_LOST was not triggered, value should not have been updated
p.author139.setText("Charles Darwin");
assertEquals("Stanislaw Lem", p.getBook().getAuthor());
//assert binding listeners were fired
assertEquals("Binding listeners were not fired",4,counter.get());
} finally {
SwingJavaBuilder.getConfig().removeBindingListener(listener);
}
}
}