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

public void testCanCatchDifferentLengthOfIteration() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testCanCatchDifferentLengthOfIteration();
}

public void testCanCatchDifferentRemoveBehaviour() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testCanCatchDifferentRemoveBehaviour();
}

public void testCanCatchSunJavaBug6529795InTargetIterator() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testCanCatchSunJavaBug6529795InTargetIterator();
}

public void testMismatchedException() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testMismatchedException();
}

public void testMissingException() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testMissingException();
}

public void testSimilarException() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testSimilarException();
}

public void testUnexpectedException() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testUnexpectedException();
}

public void testUnknownOrder() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testUnknownOrder();
}

public void testUnknownOrderUnrecognizedElement() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testUnknownOrderUnrecognizedElement();
}

public void testVerifyCanThrowAssertionThatFailsTest() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testVerifyCanThrowAssertionThatFailsTest();
}

public void testVerifyGetsCalled() throws Exception {
  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
  testCase.testVerifyGetsCalled();
}
}
