You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BinderStatusChangeTest.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. /*
  2. * Copyright 2000-2016 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.data;
  17. import java.util.concurrent.atomic.AtomicReference;
  18. import org.junit.Assert;
  19. import org.junit.Before;
  20. import org.junit.Test;
  21. import com.vaadin.data.Binder.Binding;
  22. import com.vaadin.data.Binder.BindingBuilder;
  23. import com.vaadin.data.util.converter.StringToIntegerConverter;
  24. import com.vaadin.tests.data.bean.Person;
  25. /**
  26. * @author Vaadin Ltd
  27. *
  28. */
  29. public class BinderStatusChangeTest
  30. extends BinderTestBase<Binder<Person>, Person> {
  31. private AtomicReference<StatusChangeEvent> event;
  32. @Before
  33. public void setUp() {
  34. binder = new Binder<>();
  35. item = new Person();
  36. event = new AtomicReference<>();
  37. }
  38. @Test
  39. public void bindBinding_unbound_eventWhenBoundEndnoEventsBeforeBound() {
  40. binder.addStatusChangeListener(this::statusChanged);
  41. BindingBuilder<Person, String> binding = binder.forField(nameField);
  42. nameField.setValue("");
  43. Assert.assertNull(event.get());
  44. binding.bind(Person::getFirstName, Person::setFirstName);
  45. verifyEvent();
  46. }
  47. @Test
  48. public void bindBinder_unbound_singleEventWhenBound() {
  49. binder.addStatusChangeListener(this::statusChanged);
  50. Assert.assertNull(event.get());
  51. binder.setBean(item);
  52. verifyEvent();
  53. }
  54. @Test
  55. public void removeBean_bound_singleEventWhenUnBound() {
  56. binder.setBean(item);
  57. binder.addStatusChangeListener(this::statusChanged);
  58. Assert.assertNull(event.get());
  59. binder.removeBean();
  60. verifyEvent();
  61. }
  62. @Test
  63. public void removeBean_unbound_noEventWhenUnBound() {
  64. binder.addStatusChangeListener(this::statusChanged);
  65. Assert.assertNull(event.get());
  66. binder.removeBean();
  67. Assert.assertNull(event.get());
  68. }
  69. @Test
  70. public void setValue_bound_singleEventOnSetValue() {
  71. binder.forField(nameField).bind(Person::getFirstName,
  72. Person::setFirstName);
  73. binder.setBean(item);
  74. binder.addStatusChangeListener(this::statusChanged);
  75. Assert.assertNull(event.get());
  76. nameField.setValue("foo");
  77. verifyEvent();
  78. }
  79. @Test
  80. public void setValue_severalBoundFieldsAndBoundBinder_singleEventOnSetValue() {
  81. binder.forField(nameField).bind(Person::getFirstName,
  82. Person::setFirstName);
  83. binder.forField(ageField)
  84. .withConverter(new StringToIntegerConverter(""))
  85. .bind(Person::getAge, Person::setAge);
  86. binder.setBean(item);
  87. binder.addStatusChangeListener(this::statusChanged);
  88. Assert.assertNull(event.get());
  89. nameField.setValue("foo");
  90. verifyEvent();
  91. }
  92. @Test
  93. public void setInvalidValue_bound_singleEventOnSetValue() {
  94. binder.forField(nameField).withValidator(name -> false, "")
  95. .bind(Person::getFirstName, Person::setFirstName);
  96. binder.setBean(item);
  97. binder.addStatusChangeListener(this::statusChanged);
  98. Assert.assertNull(event.get());
  99. nameField.setValue("foo");
  100. verifyEvent(true);
  101. }
  102. @Test
  103. public void setInvalidBean_bound_singleEventOnSetValue() {
  104. binder.forField(nameField).bind(Person::getFirstName,
  105. Person::setFirstName);
  106. binder.setBean(item);
  107. binder.withValidator(Validator.from(bean -> false, ""));
  108. binder.addStatusChangeListener(this::statusChanged);
  109. Assert.assertNull(event.get());
  110. nameField.setValue("foo");
  111. verifyEvent(true);
  112. }
  113. @Test
  114. public void readBean_hasBindings_singleEventOnLoad() {
  115. binder.forField(nameField).bind(Person::getFirstName,
  116. Person::setFirstName);
  117. binder.addStatusChangeListener(this::statusChanged);
  118. Assert.assertNull(event.get());
  119. binder.readBean(item);
  120. verifyEvent();
  121. }
  122. @Test
  123. public void readBean_hasSeveralBindings_singleEventOnLoad() {
  124. binder.forField(nameField).bind(Person::getFirstName,
  125. Person::setFirstName);
  126. binder.forField(ageField)
  127. .withConverter(new StringToIntegerConverter(""))
  128. .bind(Person::getAge, Person::setAge);
  129. binder.addStatusChangeListener(this::statusChanged);
  130. Assert.assertNull(event.get());
  131. binder.readBean(item);
  132. verifyEvent();
  133. }
  134. @Test
  135. public void readBean_hasNoBindings_singleEvent() {
  136. binder.addStatusChangeListener(this::statusChanged);
  137. Assert.assertNull(event.get());
  138. binder.readBean(item);
  139. verifyEvent();
  140. }
  141. @Test
  142. public void writeBean_hasNoBindings_singleEvent()
  143. throws ValidationException {
  144. binder.addStatusChangeListener(this::statusChanged);
  145. Assert.assertNull(event.get());
  146. binder.writeBean(item);
  147. verifyEvent();
  148. }
  149. @Test
  150. public void writeBeanIfValid_hasNoBindings_singleEvent() {
  151. binder.addStatusChangeListener(this::statusChanged);
  152. Assert.assertNull(event.get());
  153. binder.writeBeanIfValid(item);
  154. verifyEvent();
  155. }
  156. @Test
  157. public void writeBean_hasBindings_singleEvent() throws ValidationException {
  158. binder.forField(nameField).bind(Person::getFirstName,
  159. Person::setFirstName);
  160. binder.readBean(item);
  161. binder.addStatusChangeListener(this::statusChanged);
  162. Assert.assertNull(event.get());
  163. binder.writeBean(item);
  164. verifyEvent();
  165. }
  166. @Test
  167. public void writeBean_hasSeveralBindings_singleEvent()
  168. throws ValidationException {
  169. binder.forField(nameField).bind(Person::getFirstName,
  170. Person::setFirstName);
  171. binder.forField(ageField)
  172. .withConverter(new StringToIntegerConverter(""))
  173. .bind(Person::getAge, Person::setAge);
  174. binder.readBean(item);
  175. binder.addStatusChangeListener(this::statusChanged);
  176. Assert.assertNull(event.get());
  177. binder.writeBean(item);
  178. verifyEvent();
  179. }
  180. @Test
  181. public void writeBeanIfValid_hasBindings_singleEvent() {
  182. binder.forField(nameField).bind(Person::getFirstName,
  183. Person::setFirstName);
  184. binder.readBean(item);
  185. binder.addStatusChangeListener(this::statusChanged);
  186. Assert.assertNull(event.get());
  187. binder.writeBeanIfValid(item);
  188. verifyEvent();
  189. }
  190. @Test
  191. public void writeBeanIfValid_hasSeveralBindings_singleEvent() {
  192. binder.forField(nameField).bind(Person::getFirstName,
  193. Person::setFirstName);
  194. binder.forField(ageField)
  195. .withConverter(new StringToIntegerConverter(""))
  196. .bind(Person::getAge, Person::setAge);
  197. binder.readBean(item);
  198. binder.addStatusChangeListener(this::statusChanged);
  199. Assert.assertNull(event.get());
  200. binder.writeBeanIfValid(item);
  201. verifyEvent();
  202. }
  203. @Test
  204. public void writeBeanInvalidValue_hasBindings_singleEvent() {
  205. binder.forField(nameField).withValidator(name -> false, "")
  206. .bind(Person::getFirstName, Person::setFirstName);
  207. binder.readBean(item);
  208. binder.addStatusChangeListener(this::statusChanged);
  209. Assert.assertNull(event.get());
  210. try {
  211. binder.writeBean(item);
  212. } catch (ValidationException ignore) {
  213. }
  214. verifyEvent(true);
  215. }
  216. @Test
  217. public void writeBeanIfValid_invalidValueAndBinderHasBindings_singleEvent() {
  218. binder.forField(nameField).withValidator(name -> false, "")
  219. .bind(Person::getFirstName, Person::setFirstName);
  220. binder.readBean(item);
  221. binder.addStatusChangeListener(this::statusChanged);
  222. Assert.assertNull(event.get());
  223. binder.writeBeanIfValid(item);
  224. verifyEvent(true);
  225. }
  226. @Test
  227. public void writeBeanIfValid_invalidValueAndBinderHasSeveralBindings_singleEvent() {
  228. binder.forField(nameField).withValidator(name -> false, "")
  229. .bind(Person::getFirstName, Person::setFirstName);
  230. binder.forField(ageField)
  231. .withConverter(new StringToIntegerConverter(""))
  232. .bind(Person::getAge, Person::setAge);
  233. binder.readBean(item);
  234. binder.addStatusChangeListener(this::statusChanged);
  235. Assert.assertNull(event.get());
  236. binder.writeBeanIfValid(item);
  237. verifyEvent(true);
  238. }
  239. @Test
  240. public void writeBeanInvalidBean_hasBindings_singleEvent() {
  241. binder.forField(nameField).bind(Person::getFirstName,
  242. Person::setFirstName);
  243. binder.readBean(item);
  244. binder.withValidator(Validator.from(person -> false, ""));
  245. binder.addStatusChangeListener(this::statusChanged);
  246. Assert.assertNull(event.get());
  247. try {
  248. binder.writeBean(item);
  249. } catch (ValidationException ignore) {
  250. }
  251. verifyEvent(true);
  252. }
  253. @Test
  254. public void writeBeanIfValid_invalidBeanAndBinderHasBindings_singleEvent() {
  255. binder.forField(nameField).bind(Person::getFirstName,
  256. Person::setFirstName);
  257. binder.readBean(item);
  258. binder.withValidator(Validator.from(person -> false, ""));
  259. binder.addStatusChangeListener(this::statusChanged);
  260. Assert.assertNull(event.get());
  261. binder.writeBeanIfValid(item);
  262. verifyEvent(true);
  263. }
  264. @Test
  265. public void writeValidBean_hasBindings_singleEvent()
  266. throws ValidationException {
  267. binder.forField(nameField).bind(Person::getFirstName,
  268. Person::setFirstName);
  269. binder.readBean(item);
  270. binder.withValidator(Validator.from(person -> true, ""));
  271. binder.addStatusChangeListener(this::statusChanged);
  272. Assert.assertNull(event.get());
  273. binder.writeBean(item);
  274. verifyEvent();
  275. }
  276. @Test
  277. public void writeBeanIfValid_validBeanAndBinderHasBindings_singleEvent() {
  278. binder.forField(nameField).bind(Person::getFirstName,
  279. Person::setFirstName);
  280. binder.readBean(item);
  281. binder.withValidator(Validator.from(person -> true, ""));
  282. binder.addStatusChangeListener(this::statusChanged);
  283. Assert.assertNull(event.get());
  284. binder.writeBeanIfValid(item);
  285. verifyEvent();
  286. }
  287. @Test
  288. public void validateBinder_noValidationErrors_statusEventWithoutErrors() {
  289. binder.forField(nameField).bind(Person::getFirstName,
  290. Person::setFirstName);
  291. binder.forField(ageField)
  292. .withConverter(new StringToIntegerConverter(""))
  293. .bind(Person::getAge, Person::setAge);
  294. binder.setBean(item);
  295. binder.addStatusChangeListener(this::statusChanged);
  296. Assert.assertNull(event.get());
  297. binder.validate();
  298. verifyEvent();
  299. }
  300. @Test
  301. public void validateBinder_validationErrors_statusEventWithError() {
  302. binder.forField(nameField).withValidator(name -> false, "")
  303. .bind(Person::getFirstName, Person::setFirstName);
  304. binder.forField(ageField)
  305. .withConverter(new StringToIntegerConverter(""))
  306. .bind(Person::getAge, Person::setAge);
  307. binder.setBean(item);
  308. binder.addStatusChangeListener(this::statusChanged);
  309. Assert.assertNull(event.get());
  310. binder.validate();
  311. verifyEvent(true);
  312. }
  313. @Test
  314. public void validateBinding_noValidationErrors_statusEventWithoutErrors() {
  315. Binding<Person, String> binding = binder.forField(nameField)
  316. .bind(Person::getFirstName, Person::setFirstName);
  317. binder.forField(ageField)
  318. .withConverter(new StringToIntegerConverter(""))
  319. .bind(Person::getAge, Person::setAge);
  320. binder.setBean(item);
  321. binder.addStatusChangeListener(this::statusChanged);
  322. Assert.assertNull(event.get());
  323. binding.validate();
  324. verifyEvent();
  325. }
  326. @Test
  327. public void validateBinding_validationErrors_statusEventWithError() {
  328. Binding<Person, String> binding = binder.forField(nameField)
  329. .withValidator(name -> false, "")
  330. .bind(Person::getFirstName, Person::setFirstName);
  331. binder.forField(ageField)
  332. .withConverter(new StringToIntegerConverter(""))
  333. .bind(Person::getAge, Person::setAge);
  334. binder.setBean(item);
  335. binder.addStatusChangeListener(this::statusChanged);
  336. Assert.assertNull(event.get());
  337. binding.validate();
  338. verifyEvent(true);
  339. }
  340. private void verifyEvent() {
  341. verifyEvent(false);
  342. }
  343. private void verifyEvent(boolean validationErrors) {
  344. StatusChangeEvent statusChangeEvent = event.get();
  345. Assert.assertNotNull(statusChangeEvent);
  346. Assert.assertEquals(binder, statusChangeEvent.getBinder());
  347. Assert.assertEquals(binder, statusChangeEvent.getSource());
  348. Assert.assertEquals(validationErrors,
  349. statusChangeEvent.hasValidationErrors());
  350. }
  351. private void statusChanged(StatusChangeEvent evt) {
  352. Assert.assertNull(event.get());
  353. event.set(evt);
  354. }
  355. }