Переглянути джерело

Fix RadioButtonGroup client-side NPE which breaks item icons.

Change-Id: I3a9c887196b503eaa8c2307d7a714ce61e6deacc
tags/8.0.0.alpha4
elmot 7 роки тому
джерело
коміт
db3a91c9b4

+ 3
- 2
client/src/main/java/com/vaadin/client/ui/VRadioButtonGroup.java Переглянути файл

@@ -229,7 +229,8 @@ public class VRadioButtonGroup extends Composite implements Field, ClickHandler,

public void selectItemKey(String selectedItemKey) {
RadioButton radioButton = keyToOptions.get(selectedItemKey);
assert radioButton != null;
radioButton.setValue(true);
if(radioButton!=null) {//Items might not be loaded yet
radioButton.setValue(true);
}
}
}

+ 3
- 3
server/src/main/java/com/vaadin/ui/RadioButtonGroup.java Переглянути файл

@@ -169,7 +169,7 @@ public class RadioButtonGroup<T> extends AbstractSingleSelect<T> {
* Returns the item icon generator.
*
* @return the currently set icon generator
* @see #setItemIconProvider
* @see #setItemIconGenerator
* @see IconGenerator
*/
public IconGenerator<T> getItemIconGenerator() {
@@ -179,8 +179,8 @@ public class RadioButtonGroup<T> extends AbstractSingleSelect<T> {
/**
* Sets the item icon generator for this radiobutton group. The icon
* generator is queried for each item to optionally display an icon next to
* the item caption. If the provider returns null for an item, no icon is
* displayed. The default provider always returns null (no icons).
* the item caption. If the generator returns null for an item, no icon is
* displayed. The default generator always returns null (no icons).
*
* @param itemIconGenerator
* the icon generator, not null

+ 41
- 6
uitest/src/main/java/com/vaadin/tests/components/radiobutton/RadioButtonGroupTestUI.java Переглянути файл

@@ -15,14 +15,15 @@
*/
package com.vaadin.tests.components.radiobutton;

import java.util.LinkedHashMap;
import java.util.stream.IntStream;

import com.vaadin.server.FontAwesome;
import com.vaadin.shared.data.selection.SelectionModel;
import com.vaadin.tests.components.abstractlisting.AbstractListingTestUI;
import com.vaadin.ui.ItemCaptionGenerator;
import com.vaadin.ui.RadioButtonGroup;

import java.util.LinkedHashMap;
import java.util.stream.IntStream;

/**
* Test UI for RadioButtonGroup component
*
@@ -44,7 +45,8 @@ public class RadioButtonGroupTestUI
super.createActions();
createListenerMenu();
createSelectionMenu();
createItemGeneratorMenu();
createItemIconGeneratorMenu();
createItemCaptionGeneratorMenu();
}

protected void createSelectionMenu() {
@@ -60,15 +62,30 @@ public class RadioButtonGroupTestUI
.forEach(item -> createClickAction("Toggle " + item,
selectionCategory, toggleSelection, item));
}
private void createItemIconGeneratorMenu() {
createBooleanAction("Use Item Icon Generator", "Item Icon Generator", false,
this::useItemIconGenerator);
}

private void createItemGeneratorMenu() {
private void useItemIconGenerator(RadioButtonGroup<Object> group,
boolean activate, Object data) {
if (activate) {
group.setItemIconGenerator(
item -> FontAwesome.values()[getIndex(item) + 1]);
} else {
group.setItemIconGenerator(item -> null);
}
group.getDataSource().refreshAll();
}

private void createItemCaptionGeneratorMenu() {
LinkedHashMap<String, ItemCaptionGenerator<Object>> options = new LinkedHashMap<>();
options.put("Null Caption Generator", item -> null);
options.put("Default Caption Generator", item -> item.toString());
options.put("Custom Caption Generator",
item -> item.toString() + " Caption");

createSelectAction("Item Caption Generator", "Item Generator", options,
createSelectAction("Item Caption Generator", "Item Caption Generator", options,
"None", (radioButtonGroup, captionGenerator, data) -> {
radioButtonGroup.setItemCaptionGenerator(captionGenerator);
radioButtonGroup.getDataSource().refreshAll();
@@ -91,4 +108,22 @@ public class RadioButtonGroupTestUI
e -> log("Selected: " + e.getSelectedItem())));
}


private int getIndex(Object item) {
int index = item.toString().indexOf(' ');
if (index < 0) {
return 0;
}
String postfix = item.toString().substring(index + 1);
index = postfix.indexOf(' ');
if (index >= 0) {
postfix = postfix.substring(0, index);
}
try {
return Integer.parseInt(postfix);
} catch (NumberFormatException e) {
return 0;
}
}

}

+ 38
- 9
uitest/src/test/java/com/vaadin/tests/components/radiobutton/RadioButtonGroupTest.java Переглянути файл

@@ -15,17 +15,20 @@
*/
package com.vaadin.tests.components.radiobutton;

import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import com.vaadin.server.FontAwesome;
import com.vaadin.testbench.By;
import com.vaadin.testbench.customelements.RadioButtonGroupElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import com.vaadin.testbench.customelements.RadioButtonGroupElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

/**
* Test for RadioButtonGroup
@@ -92,6 +95,23 @@ public class RadioButtonGroupTest extends MultiBrowserTest {
Assert.assertEquals(lastLogRow, getLogRow(0));
}

@Test
public void itemIconGenerator() {
selectMenuPath("Component", "Item Icon Generator", "Use Item Icon Generator");
assertItemsSuffices(20);

List<WebElement> icons = getSelect().findElements(By.
cssSelector(".v-select-optiongroup .v-icon"));

assertEquals(20,icons.size());

for (int i = 0; i < icons.size(); i++) {
Assert.assertEquals(FontAwesome.values()[i + 1].getCodepoint(),
icons.get(i).getText().charAt(0));
}
}


@Test
public void clickToSelect_reenable() {
selectMenuPath("Component", "State", "Enabled");
@@ -113,14 +133,14 @@ public class RadioButtonGroupTest extends MultiBrowserTest {

@Test
public void itemCaptionGenerator() {
selectMenuPath("Component", "Item Generator", "Item Caption Generator",
selectMenuPath("Component", "Item Caption Generator", "Item Caption Generator",
"Custom Caption Generator");
assertItems(20, " Caption");
}

@Test
public void nullItemCaptionGenerator() {
selectMenuPath("Component", "Item Generator", "Item Caption Generator",
selectMenuPath("Component", "Item Caption Generator", "Item Caption Generator",
"Null Caption Generator");
for (String text : getSelect().getOptions()) {
Assert.assertEquals("", text);
@@ -171,4 +191,13 @@ public class RadioButtonGroupTest extends MultiBrowserTest {
}
assertEquals("Number of items", count, i);
}

protected void assertItemsSuffices(int count) {
int i = 0;
for (String text : getSelect().getOptions()) {
assertTrue(text.endsWith("Item " + i));
i++;
}
assertEquals("Number of items", count, i);
}
}

Завантаження…
Відмінити
Зберегти