/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.faces.test.servlet30.systest;
import java.util.ArrayList;
import java.util.List;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlOption;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSelect;
import junit.framework.Test;
import junit.framework.TestSuite;
public class SelectManyCollectionITCase extends HtmlUnitFacesITCase {
/**
* Construct a new instance of this test case.
*
* @param name Name of the test case
*/
public SelectManyCollectionITCase(String name) {
super(name);
}
/**
* Set up instance variables required by this test case.
*/
public void setUp() throws Exception {
super.setUp();
}
/**
* Return the tests included in this test suite.
*/
public static Test suite() {
return new TestSuite(SelectManyCollectionITCase.class);
}
/**
* Tear down instance variables required by this test case.
*/
public void tearDown() {
super.tearDown();
}
// ------------------------------------------------------------ Test Methods
public void testSelectManyCollections() throws Exception {
HtmlPage page = getPage("/faces/standard/selectmany05.xhtml");
String[] selectIds = { "array", // 0
"list", // 1
"set", // 2
"sortedset", // 3
"collection", // 4
"ilist", // 5
"ilist2", // 6
"iset", // 7
"isortedset", // 8
"icollection", // 9
"hintString", "hintClass", "object", "intList1", "integerList1", "escape01", "escape02", "emptyItems", };
int[] totalNumberOfSelections = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, };
String[][] initialSelectionLabelFragments = { new String[0], // 0
new String[0], // 1
new String[0], // 2
new String[0], // 3
new String[0], // 4
new String[] { "Bilbo", "Pippin", "Merry" }, // 5
new String[] { "Bilbo", "Pippin", "Merry" }, // 6
new String[] { "Frodo" }, // 7
new String[] { "Pippin", "Frodo" }, // 8
new String[] { "Bilbo", "Merry" }, // 9
new String[0], new String[0], new String[0], new String[0], new String[0],
new String[] { "Bilbo - <Ring Finder>", "Merry - <Trouble Maker>" },
// Unescaped label fragments. Fragments since difficult to get raw representation
// using HtmlUnit
// Can't check for <trouble maker since it's duplicate
new String[] { "<ring finder", "Merry" }, new String[0], };
String[][] postBackSelections = { new String[] { "Bilbo" }, new String[] { "Bilbo" }, new String[] { "Bilbo" }, new String[] { "Bilbo" },
new String[] { "Bilbo" }, new String[] { "Bilbo" }, new String[] { "Bilbo" }, new String[] { "Bilbo" }, new String[] { "Bilbo" },
new String[] { "Bilbo" }, new String[] { "Bilbo" }, new String[] { "Bilbo" }, new String[] { "Bilbo" }, new String[] { "2" },
new String[] { "3" }, new String[] { "Bilbo - <Ring Finder>" }, new String[] {}, new String[] {}, };
// =====================================================================
// Validate initial page state
//
List<HtmlSelect> selects = new ArrayList<HtmlSelect>(18);
getAllElementsOfGivenClass(page, selects, HtmlSelect.class);
assertTrue(selects.size() == 18);
for (int i = 0; i < selectIds.length; i++) {
String id = selectIds[i];
// System.out.println("Validating HtmlSelect with ID: " + id);
String[] initialSelection = initialSelectionLabelFragments[i];
String[] newSelection = postBackSelections[i];
HtmlSelect select = getHtmlSelectForId(selects, id);
assertNotNull(select);
validateState(select, totalNumberOfSelections[i], initialSelection);
updateSelections(select, totalNumberOfSelections[i], newSelection);
}
HtmlInput input = getInputContainingGivenId(page, "command");
page = (HtmlPage) input.click();
// ensure no messages were queued by the post-back
assertTrue(!page.asText().contains("Error"));
selects.clear();
getAllElementsOfGivenClass(page, selects, HtmlSelect.class);
assertTrue(selects.size() == 18);
for (int i = 0; i < selectIds.length; i++) {
String id = selectIds[i];
if ("escape02".equals(id)) {
continue;
}
String[] newSelection = postBackSelections[i];
HtmlSelect select = getHtmlSelectForId(selects, id);
assertNotNull(select);
validateState(select, totalNumberOfSelections[i], newSelection);
}
}
// --------------------------------------------------------- Private Methods
private void updateSelections(HtmlSelect select, int totalNumberOfOptions, String[] selectedOptions) {
assertNotNull(select);
List<HtmlOption> options = select.getOptions();
assertTrue(options.size() == totalNumberOfOptions);
for (String s : selectedOptions) {
for (HtmlOption option : options) {
option.setSelected(s.equals(option.asText()));
}
}
}
private void validateState(HtmlSelect select, int totalNumberOfOptions, String[] labelFragmentToLookFor) {
assertNotNull(select);
List<HtmlOption> options = select.getOptions();
assertTrue(options.size() == totalNumberOfOptions);
if (labelFragmentToLookFor == null || labelFragmentToLookFor.length == 0) {
for (HtmlOption option : options) {
// System.out.println(option.asText());
assertTrue(!option.isSelected());
}
} else {
for (String labelFragment : labelFragmentToLookFor) {
// System.out.println("*** text to look for:" + text);
for (HtmlOption option : options) {
// System.out.println("*** option as text:" + option.asText());
// System.out.println("*** option as xml:" + option.asXml());
//
// System.out.println("*** label attribute:" + option.getLabelAttribute());
if (option.asXml().contains(labelFragment)) {
assertTrue(option.isSelected());
}
}
}
}
}
private HtmlSelect getHtmlSelectForId(List<HtmlSelect> selects, String id) {
for (HtmlSelect select : selects) {
if (select.getId().contains(id)) {
return select;
}
}
return null;
}
}