/*
 * Copyright (C) 2008 The Guava Authors
 *
 * 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 com.google.common.collect;
public class ArrayTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
@Override public String getModuleName() {
  return "com.google.common.collect.testModule";
}
public void testAt() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testAt();
}

public void testCellReflectsChanges() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCellReflectsChanges();
}

public void testCellSetToString_ordered() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCellSetToString_ordered();
}

public void testClear() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testClear();
}

public void testColumn() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testColumn();
}

public void testColumnKeyList() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testColumnKeyList();
}

public void testColumnKeySetToString_ordered() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testColumnKeySetToString_ordered();
}

public void testColumnMissing() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testColumnMissing();
}

public void testColumnNull() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testColumnNull();
}

public void testColumnPutIllegal() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testColumnPutIllegal();
}

public void testColumnSetPartialOverlap() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testColumnSetPartialOverlap();
}

public void testContains() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testContains();
}

public void testContainsColumn() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testContainsColumn();
}

public void testContainsRow() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testContainsRow();
}

public void testContainsValue() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testContainsValue();
}

public void testCreateCopyArrayTable() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateCopyArrayTable();
}

public void testCreateCopyEmptyArrayTable() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateCopyEmptyArrayTable();
}

public void testCreateCopyEmptyTable() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateCopyEmptyTable();
}

public void testCreateCopyHashBasedTable() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateCopyHashBasedTable();
}

public void testCreateDuplicateColumns() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateDuplicateColumns();
}

public void testCreateDuplicateRows() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateDuplicateRows();
}

public void testCreateEmptyColumns() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateEmptyColumns();
}

public void testCreateEmptyRows() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateEmptyRows();
}

public void testCreateEmptyRowsXColumns() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testCreateEmptyRowsXColumns();
}

public void testEquals() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testEquals();
}

public void testErase() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testErase();
}

public void testEraseAll() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testEraseAll();
}

public void testGet() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testGet();
}

public void testGetMissingKeys() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testGetMissingKeys();
}

public void testHashCode() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testHashCode();
}

public void testIsEmpty() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testIsEmpty();
}

public void testPut() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testPut();
}

public void testPutAllTable() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testPutAllTable();
}

public void testPutIllegal() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testPutIllegal();
}

public void testPutNull() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testPutNull();
}

public void testPutNullReplace() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testPutNullReplace();
}

public void testRemove() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testRemove();
}

public void testRow() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testRow();
}

public void testRowClearAndPut() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testRowClearAndPut();
}

public void testRowKeyList() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testRowKeyList();
}

public void testRowKeySetToString_ordered() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testRowKeySetToString_ordered();
}

public void testRowMissing() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testRowMissing();
}

public void testRowNull() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testRowNull();
}

public void testRowPutIllegal() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testRowPutIllegal();
}

public void testSerialization() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testSerialization();
}

public void testSet() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testSet();
}

public void testSize() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testSize();
}

public void testToStringSize1() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testToStringSize1();
}

public void testToString_ordered() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testToString_ordered();
}

public void testValuesToString_ordered() throws Exception {
  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
  testCase.setUp();
  testCase.testValuesToString_ordered();
}
}
