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

public void testCreateFromMultimap() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testCreateFromMultimap();
}

public void testCreateFromSize() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testCreateFromSize();
}

public void testEntriesAfterMultimapUpdate() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testEntriesAfterMultimapUpdate();
}

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

public void testGetRandomAccess() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testGetRandomAccess();
}

public void testLinkedAsMapEntries() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedAsMapEntries();
}

public void testLinkedClear() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedClear();
}

public void testLinkedEntries() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedEntries();
}

public void testLinkedGetAdd() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedGetAdd();
}

public void testLinkedGetInsert() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedGetInsert();
}

public void testLinkedKeySet() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedKeySet();
}

public void testLinkedKeys() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedKeys();
}

public void testLinkedPutAllMultimap() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedPutAllMultimap();
}

public void testLinkedPutInOrder() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedPutInOrder();
}

public void testLinkedPutOutOfOrder() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedPutOutOfOrder();
}

public void testLinkedReplaceValues() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedReplaceValues();
}

public void testLinkedValues() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testLinkedValues();
}

public void testRemoveAllRandomAccess() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testRemoveAllRandomAccess();
}

public void testReplaceValuesRandomAccess() throws Exception {
  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
  testCase.testReplaceValuesRandomAccess();
}
}
