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

public void testCompare() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testCompare();
}

public void testDecodeInt() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testDecodeInt();
}

public void testDecodeIntFails() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testDecodeIntFails();
}

public void testDivide() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testDivide();
}

public void testJoin() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testJoin();
}

public void testLexicographicalComparator() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testLexicographicalComparator();
}

public void testMax() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testMax();
}

public void testMax_noArgs() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testMax_noArgs();
}

public void testMin() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testMin();
}

public void testMin_noArgs() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testMin_noArgs();
}

public void testParseInt() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testParseInt();
}

public void testParseIntFail() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testParseIntFail();
}

public void testParseIntThrowsExceptionForInvalidRadix() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testParseIntThrowsExceptionForInvalidRadix();
}

public void testParseIntWithRadix() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testParseIntWithRadix();
}

public void testParseIntWithRadixLimits() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testParseIntWithRadixLimits();
}

public void testRemainder() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testRemainder();
}

public void testSaturatedCast() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testSaturatedCast();
}

public void testSort() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testSort();
}

public void testSortDescending() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testSortDescending();
}

public void testSortDescendingIndexed() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testSortDescendingIndexed();
}

public void testSortIndexed() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testSortIndexed();
}

public void testToLong() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testToLong();
}

public void testToString() throws Exception {
  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
  testCase.testToString();
}
}
