/*
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
    Bug: http://code.google.com/p/chromium/issues/detail?id=145881
  */
  @DisabledTest
  public void testPassNumberDouble() throws Throwable {
    executeJavaScript("testObject.setByteValue(42.1);");
    assertEquals(42, mTestObject.waitForByteValue());
    executeJavaScript("testObject.setByteValue(" + Byte.MAX_VALUE + " + 42.1);");
    assertEquals(Byte.MIN_VALUE + 42 - 1, mTestObject.waitForByteValue());
    executeJavaScript("testObject.setByteValue(" + Integer.MAX_VALUE + " + 42.1);");
    assertEquals(-1, mTestObject.waitForByteValue());

    // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
    executeJavaScript("testObject.setCharValue(42.1);");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    executeJavaScript("testObject.setShortValue(42.1);");
    assertEquals(42, mTestObject.waitForShortValue());
    executeJavaScript("testObject.setShortValue(" + Short.MAX_VALUE + " + 42.1);");
    assertEquals(Short.MIN_VALUE + 42 - 1, mTestObject.waitForShortValue());
    executeJavaScript("testObject.setShortValue(" + Integer.MAX_VALUE + " + 42.1);");
    assertEquals(-1, mTestObject.waitForShortValue());

    executeJavaScript("testObject.setIntValue(42.1);");
    assertEquals(42, mTestObject.waitForIntValue());
    executeJavaScript("testObject.setIntValue(" + Integer.MAX_VALUE + " + 42.1);");
    assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntValue());

    executeJavaScript("testObject.setLongValue(42.1);");
    assertEquals(42L, mTestObject.waitForLongValue());
    // LIVECONNECT_COMPLIANCE: Should be Long.MAX_VALUE.
    executeJavaScript("testObject.setLongValue(" + Long.MAX_VALUE + " + 42.1);");
    assertEquals(Long.MIN_VALUE, mTestObject.waitForLongValue());

    executeJavaScript("testObject.setFloatValue(42.1);");
    assertEquals(42.1f, mTestObject.waitForFloatValue());

    executeJavaScript("testObject.setDoubleValue(42.1);");
    assertEquals(42.1, mTestObject.waitForDoubleValue());

    // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
    executeJavaScript("testObject.setObjectValue(42.1);");
    assertNull(mTestObject.waitForObjectValue());

    executeJavaScript("testObject.setStringValue(42.1);");
    assertEquals("42.1", mTestObject.waitForStringValue());

    executeJavaScript("testObject.setBooleanValue(0.0);");
    assertFalse(mTestObject.waitForBooleanValue());
    // LIVECONNECT_COMPLIANCE: Should be true.
    executeJavaScript("testObject.setBooleanValue(42.1);");
    assertFalse(mTestObject.waitForBooleanValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setCustomTypeValue(42.1);");
    assertNull(mTestObject.waitForCustomTypeValue());
  }
  // Test passing a JavaScript number in the int32 range to a method of an
  // injected object.
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
  public void testPassNumberInt32() throws Throwable {
    executeJavaScript("testObject.setByteValue(42);");
    assertEquals(42, mTestObject.waitForByteValue());
    executeJavaScript("testObject.setByteValue(" + Byte.MAX_VALUE + " + 42);");
    assertEquals(Byte.MIN_VALUE + 42 - 1, mTestObject.waitForByteValue());

    // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
    executeJavaScript("testObject.setCharValue(42);");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    executeJavaScript("testObject.setShortValue(42);");
    assertEquals(42, mTestObject.waitForShortValue());
    executeJavaScript("testObject.setShortValue(" + Short.MAX_VALUE + " + 42);");
    assertEquals(Short.MIN_VALUE + 42 - 1, mTestObject.waitForShortValue());

    executeJavaScript("testObject.setIntValue(42);");
    assertEquals(42, mTestObject.waitForIntValue());

    executeJavaScript("testObject.setLongValue(42);");
    assertEquals(42L, mTestObject.waitForLongValue());

    executeJavaScript("testObject.setFloatValue(42);");
    assertEquals(42.0f, mTestObject.waitForFloatValue());

    executeJavaScript("testObject.setDoubleValue(42);");
    assertEquals(42.0, mTestObject.waitForDoubleValue());

    // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
    executeJavaScript("testObject.setObjectValue(42);");
    assertNull(mTestObject.waitForObjectValue());

    // The spec allows the JS engine flexibility in how to format the number.
    executeJavaScript("testObject.setStringValue(42);");
    String str = mTestObject.waitForStringValue();
    assertTrue("42".equals(str) || "42.0".equals(str));

    executeJavaScript("testObject.setBooleanValue(0);");
    assertFalse(mTestObject.waitForBooleanValue());
    // LIVECONNECT_COMPLIANCE: Should be true;
    executeJavaScript("testObject.setBooleanValue(42);");
    assertFalse(mTestObject.waitForBooleanValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setCustomTypeValue(42);");
    assertNull(mTestObject.waitForCustomTypeValue());
  }
  // Test passing a Java object to a method of an injected object. Note that
  // this test requires being able to return objects from the methods of
  // injected objects. This is tested elsewhere.
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
  public void testPassJavaObject() throws Throwable {
    executeJavaScript("testObject.setObjectValue(testObject.getObjectInstance());");
    assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForObjectValue());
    executeJavaScript("testObject.setObjectValue(testObject.getCustomTypeInstance());");
    assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForObjectValue());

    executeJavaScript("testObject.setCustomTypeValue(testObject.getObjectInstance());");
    assertTrue(mTestObject.getObjectInstance() == mTestObject.waitForCustomTypeValue());
    executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomTypeInstance());");
    assertTrue(mTestObject.getCustomTypeInstance() == mTestObject.waitForCustomTypeValue());
    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception, as the types are unrelated.
    executeJavaScript("testObject.setCustomTypeValue(testObject.getCustomType2Instance());");
    assertTrue(
        mTestObject.getCustomType2Instance() == (Object) mTestObject.waitForCustomTypeValue());

    // LIVECONNECT_COMPLIANCE: Should call toString() on object.
    executeJavaScript("testObject.setStringValue(testObject.getObjectInstance());");
    assertEquals("undefined", mTestObject.waitForStringValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setByteValue(testObject.getObjectInstance());");
    assertEquals(0, mTestObject.waitForByteValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setCharValue(testObject.getObjectInstance());");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setShortValue(testObject.getObjectInstance());");
    assertEquals(0, mTestObject.waitForShortValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setIntValue(testObject.getObjectInstance());");
    assertEquals(0, mTestObject.waitForIntValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setLongValue(testObject.getObjectInstance());");
    assertEquals(0L, mTestObject.waitForLongValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setFloatValue(testObject.getObjectInstance());");
    assertEquals(0.0f, mTestObject.waitForFloatValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setDoubleValue(testObject.getObjectInstance());");
    assertEquals(0.0, mTestObject.waitForDoubleValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setBooleanValue(testObject.getObjectInstance());");
    assertFalse(mTestObject.waitForBooleanValue());
  }
  // Test passing a JavaScript string to a method of an injected object.
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
  public void testPassString() throws Throwable {
    executeJavaScript("testObject.setStringValue(\"+042.10\");");
    assertEquals("+042.10", mTestObject.waitForStringValue());

    // Make sure that we distinguish between the empty string and NULL.
    executeJavaScript("testObject.setStringValue(\"\");");
    assertEquals("", mTestObject.waitForStringValue());

    // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.String.
    executeJavaScript("testObject.setObjectValue(\"+042.10\");");
    assertNull(mTestObject.waitForObjectValue());

    // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    executeJavaScript("testObject.setByteValue(\"+042.10\");");
    assertEquals(0, mTestObject.waitForByteValue());

    // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    executeJavaScript("testObject.setShortValue(\"+042.10\");");
    assertEquals(0, mTestObject.waitForShortValue());

    // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    executeJavaScript("testObject.setIntValue(\"+042.10\");");
    assertEquals(0, mTestObject.waitForIntValue());

    // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    executeJavaScript("testObject.setLongValue(\"+042.10\");");
    assertEquals(0L, mTestObject.waitForLongValue());

    // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    executeJavaScript("testObject.setFloatValue(\"+042.10\");");
    assertEquals(0.0f, mTestObject.waitForFloatValue());

    // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
    executeJavaScript("testObject.setDoubleValue(\"+042.10\");");
    assertEquals(0.0, mTestObject.waitForDoubleValue());

    // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
    executeJavaScript("testObject.setCharValue(\"+042.10\");");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
    executeJavaScript("testObject.setBooleanValue(\"+042.10\");");
    assertFalse(mTestObject.waitForBooleanValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setCustomTypeValue(\"+042.10\");");
    assertNull(mTestObject.waitForCustomTypeValue());
  }
  /*
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
    Bug: http://code.google.com/p/chromium/issues/detail?id=145881
  */
  @DisabledTest
  public void testPassNumberInfinity() throws Throwable {
    executeJavaScript("testObject.setByteValue(Infinity);");
    assertEquals(-1, mTestObject.waitForByteValue());

    // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
    executeJavaScript("testObject.setCharValue(Infinity);");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    executeJavaScript("testObject.setShortValue(Infinity);");
    assertEquals(-1, mTestObject.waitForShortValue());

    executeJavaScript("testObject.setIntValue(Infinity);");
    assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntValue());

    // LIVECONNECT_COMPLIANCE: Should be Long.MAX_VALUE.
    executeJavaScript("testObject.setLongValue(Infinity);");
    assertEquals(-1L, mTestObject.waitForLongValue());

    executeJavaScript("testObject.setFloatValue(Infinity);");
    assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatValue());

    executeJavaScript("testObject.setDoubleValue(Infinity);");
    assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleValue());

    // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
    executeJavaScript("testObject.setObjectValue(Infinity);");
    assertNull(mTestObject.waitForObjectValue());

    executeJavaScript("testObject.setStringValue(Infinity);");
    assertEquals("Inf", mTestObject.waitForStringValue());

    executeJavaScript("testObject.setBooleanValue(Infinity);");
    assertFalse(mTestObject.waitForBooleanValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setCustomTypeValue(Infinity);");
    assertNull(mTestObject.waitForCustomTypeValue());
  }
  // Test passing JavaScript undefined to a method of an injected object.
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
  public void testPassUndefined() throws Throwable {
    executeJavaScript("testObject.setObjectValue(undefined);");
    assertNull(mTestObject.waitForObjectValue());

    executeJavaScript("testObject.setCustomTypeValue(undefined);");
    assertNull(mTestObject.waitForCustomTypeValue());

    // LIVECONNECT_COMPLIANCE: Should be NULL.
    executeJavaScript("testObject.setStringValue(undefined);");
    assertEquals("undefined", mTestObject.waitForStringValue());

    executeJavaScript("testObject.setByteValue(undefined);");
    assertEquals(0, mTestObject.waitForByteValue());

    executeJavaScript("testObject.setCharValue(undefined);");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    executeJavaScript("testObject.setShortValue(undefined);");
    assertEquals(0, mTestObject.waitForShortValue());

    executeJavaScript("testObject.setIntValue(undefined);");
    assertEquals(0, mTestObject.waitForIntValue());

    executeJavaScript("testObject.setLongValue(undefined);");
    assertEquals(0L, mTestObject.waitForLongValue());

    executeJavaScript("testObject.setFloatValue(undefined);");
    assertEquals(0.0f, mTestObject.waitForFloatValue());

    executeJavaScript("testObject.setDoubleValue(undefined);");
    assertEquals(0.0, mTestObject.waitForDoubleValue());

    executeJavaScript("testObject.setBooleanValue(undefined);");
    assertFalse(mTestObject.waitForBooleanValue());
  }
  /*
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
    Bug: http://code.google.com/p/chromium/issues/detail?id=145881
  */
  @DisabledTest
  public void testPassNumberNaN() throws Throwable {
    executeJavaScript("testObject.setByteValue(Number.NaN);");
    assertEquals(0, mTestObject.waitForByteValue());

    executeJavaScript("testObject.setCharValue(Number.NaN);");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    executeJavaScript("testObject.setShortValue(Number.NaN);");
    assertEquals(0, mTestObject.waitForShortValue());

    executeJavaScript("testObject.setIntValue(Number.NaN);");
    assertEquals(0, mTestObject.waitForIntValue());

    executeJavaScript("testObject.setLongValue(Number.NaN);");
    assertEquals(0L, mTestObject.waitForLongValue());

    executeJavaScript("testObject.setFloatValue(Number.NaN);");
    assertEquals(Float.NaN, mTestObject.waitForFloatValue());

    executeJavaScript("testObject.setDoubleValue(Number.NaN);");
    assertEquals(Double.NaN, mTestObject.waitForDoubleValue());

    // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Number.
    executeJavaScript("testObject.setObjectValue(Number.NaN);");
    assertNull(mTestObject.waitForObjectValue());

    executeJavaScript("testObject.setStringValue(Number.NaN);");
    assertEquals("NaN", mTestObject.waitForStringValue());

    executeJavaScript("testObject.setBooleanValue(Number.NaN);");
    assertFalse(mTestObject.waitForBooleanValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setCustomTypeValue(Number.NaN);");
    assertNull(mTestObject.waitForCustomTypeValue());
  }
  // Test passing JavaScript null to a method of an injected object.
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
  public void testPassNull() throws Throwable {
    executeJavaScript("testObject.setObjectValue(null);");
    assertNull(mTestObject.waitForObjectValue());

    executeJavaScript("testObject.setCustomTypeValue(null);");
    assertNull(mTestObject.waitForCustomTypeValue());

    executeJavaScript("testObject.setStringValue(null);");
    assertNull(mTestObject.waitForStringValue());

    executeJavaScript("testObject.setByteValue(null);");
    assertEquals(0, mTestObject.waitForByteValue());

    executeJavaScript("testObject.setCharValue(null);");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    executeJavaScript("testObject.setShortValue(null);");
    assertEquals(0, mTestObject.waitForShortValue());

    executeJavaScript("testObject.setIntValue(null);");
    assertEquals(0, mTestObject.waitForIntValue());

    executeJavaScript("testObject.setLongValue(null);");
    assertEquals(0L, mTestObject.waitForLongValue());

    executeJavaScript("testObject.setFloatValue(null);");
    assertEquals(0.0f, mTestObject.waitForFloatValue());

    executeJavaScript("testObject.setDoubleValue(null);");
    assertEquals(0.0, mTestObject.waitForDoubleValue());

    executeJavaScript("testObject.setBooleanValue(null);");
    assertFalse(mTestObject.waitForBooleanValue());
  }
  // Test passing a JavaScript boolean to a method of an injected object.
  @SmallTest
  @Feature({"Android-WebView", "Android-JavaBridge"})
  public void testPassBoolean() throws Throwable {
    executeJavaScript("testObject.setBooleanValue(true);");
    assertTrue(mTestObject.waitForBooleanValue());
    executeJavaScript("testObject.setBooleanValue(false);");
    assertFalse(mTestObject.waitForBooleanValue());

    // LIVECONNECT_COMPLIANCE: Should create an instance of java.lang.Boolean.
    executeJavaScript("testObject.setObjectValue(true);");
    assertNull(mTestObject.waitForObjectValue());

    executeJavaScript("testObject.setStringValue(false);");
    assertEquals("false", mTestObject.waitForStringValue());
    executeJavaScript("testObject.setStringValue(true);");
    assertEquals("true", mTestObject.waitForStringValue());

    // LIVECONNECT_COMPLIANCE: Should be 1.
    executeJavaScript("testObject.setByteValue(true);");
    assertEquals(0, mTestObject.waitForByteValue());
    executeJavaScript("testObject.setByteValue(false);");
    assertEquals(0, mTestObject.waitForByteValue());

    // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
    executeJavaScript("testObject.setCharValue(true);");
    assertEquals('\u0000', mTestObject.waitForCharValue());
    executeJavaScript("testObject.setCharValue(false);");
    assertEquals('\u0000', mTestObject.waitForCharValue());

    // LIVECONNECT_COMPLIANCE: Should be 1.
    executeJavaScript("testObject.setShortValue(true);");
    assertEquals(0, mTestObject.waitForShortValue());
    executeJavaScript("testObject.setShortValue(false);");
    assertEquals(0, mTestObject.waitForShortValue());

    // LIVECONNECT_COMPLIANCE: Should be 1.
    executeJavaScript("testObject.setIntValue(true);");
    assertEquals(0, mTestObject.waitForIntValue());
    executeJavaScript("testObject.setIntValue(false);");
    assertEquals(0, mTestObject.waitForIntValue());

    // LIVECONNECT_COMPLIANCE: Should be 1.
    executeJavaScript("testObject.setLongValue(true);");
    assertEquals(0L, mTestObject.waitForLongValue());
    executeJavaScript("testObject.setLongValue(false);");
    assertEquals(0L, mTestObject.waitForLongValue());

    // LIVECONNECT_COMPLIANCE: Should be 1.0.
    executeJavaScript("testObject.setFloatValue(true);");
    assertEquals(0.0f, mTestObject.waitForFloatValue());
    executeJavaScript("testObject.setFloatValue(false);");
    assertEquals(0.0f, mTestObject.waitForFloatValue());

    // LIVECONNECT_COMPLIANCE: Should be 1.0.
    executeJavaScript("testObject.setDoubleValue(true);");
    assertEquals(0.0, mTestObject.waitForDoubleValue());
    executeJavaScript("testObject.setDoubleValue(false);");
    assertEquals(0.0, mTestObject.waitForDoubleValue());

    // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
    executeJavaScript("testObject.setCustomTypeValue(true);");
    assertNull(mTestObject.waitForCustomTypeValue());
  }