/*
 * 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 TablesTransformValuesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
@Override public String getModuleName() {
  return "com.google.common.collect.testModule";
}
public void testClear() throws Exception {
  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
  testCase.setUp();
  testCase.testClear();
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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