package org.altbeacon.beacon;
import android.os.Parcel;
import static android.test.MoreAsserts.assertNotEqual;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import org.robolectric.RobolectricTestRunner;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.robolectric.annotation.Config;
import java.util.Arrays;
import java.util.UUID;
@Config(sdk = 18)
@RunWith(RobolectricTestRunner.class)
/*
HOW TO SEE DEBUG LINES FROM YOUR UNIT TESTS:
1. set a line like this at the start of your test:
org.robolectric.shadows.ShadowLog.stream = System.err;
2. run the tests from the command line
3. Look at the test report file in your web browser, e.g.
file:///Users/dyoung/workspace/AndroidProximityLibrary/build/reports/tests/index.html
4. Expand the System.err section
*/
public class IdentifierTest {
@Test
public void testEqualsNormalizationIgnoresCase() {
Identifier identifier1 = Identifier.parse("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6");
Identifier identifier2 = Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6");
assertTrue("Identifiers of different case should match", identifier1.equals(identifier2));
}
@Test
public void testToStringNormalizesCase() {
Identifier identifier1 = Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6");
assertEquals("Identifiers of different case should match", "2f234454-cf6d-4a0f-adf2-f4911ba9ffa6", identifier1.toString());
}
@Test
public void testToStringEqualsUuid() {
Identifier identifier1 = Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6");
assertEquals("uuidString of Identifier should match", "2f234454-cf6d-4a0f-adf2-f4911ba9ffa6", identifier1.toUuidString());
}
@Test
public void testToUuidEqualsToUuidString() {
Identifier identifier1 = Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6");
assertEquals("uuidString of Identifier should match", identifier1.toUuid().toString(), identifier1.toUuidString());
}
@Test
public void testToByteArrayConvertsUuids() {
Identifier identifier1 = Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6");
byte[] bytes = identifier1.toByteArrayOfSpecifiedEndianness(true);
assertEquals("byte array is correct length", bytes.length, 16);
assertEquals("first byte of uuid converted properly", 0x2f, bytes[0] & 0xFF);
assertEquals("second byte of uuid converted properly", 0x23, bytes[1] & 0xFF);
assertEquals("last byte of uuid converted properly", 0xa6, bytes[15] & 0xFF);
}
@Test
public void testToByteArrayConvertsUuidsAsLittleEndian() {
Identifier identifier1 = Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6");
byte[] bytes = identifier1.toByteArrayOfSpecifiedEndianness(false);
assertEquals("byte array is correct length", bytes.length, 16);
assertEquals("first byte of uuid converted properly", 0xa6, bytes[0] & 0xFF);
assertEquals("last byte of uuid converted properly", 0x2f, bytes[15] & 0xFF);
}
@Test
public void testToByteArrayConvertsHex() {
Identifier identifier1 = Identifier.parse("0x010203040506");
byte[] bytes = identifier1.toByteArrayOfSpecifiedEndianness(true);
assertEquals("byte array is correct length", bytes.length, 6);
assertEquals("first byte of hex is converted properly", 0x01, bytes[0] & 0xFF);
assertEquals("last byte of hex is converted properly", 0x06, bytes[5] & 0xFF);
}
@Test
public void testToByteArrayConvertsDecimal() {
Identifier identifier1 = Identifier.parse("65534");
byte[] bytes = identifier1.toByteArrayOfSpecifiedEndianness(true);
assertEquals("byte array is correct length", bytes.length, 2);
assertEquals("reported byte array is correct length", identifier1.getByteCount(), 2);
assertEquals("first byte of decimal converted properly", 0xff, bytes[0] & 0xFF);
assertEquals("last byte of decimal converted properly", 0xfe, bytes[1] & 0xFF);
}
@Test
public void testToByteArrayConvertsInt() {
Identifier identifier1 = Identifier.fromInt(65534);
byte[] bytes = identifier1.toByteArrayOfSpecifiedEndianness(true);
assertEquals("byte array is correct length", bytes.length, 2);
assertEquals("reported byte array is correct length", identifier1.getByteCount(), 2);
assertEquals("conversion back equals original value", identifier1.toInt(), 65534);
assertEquals("first byte of decimal converted properly", 0xff, bytes[0] & 0xFF);
assertEquals("last byte of decimal converted properly", 0xfe, bytes[1] & 0xFF);
}
@Test
public void testToByteArrayFromByteArray() {
byte[] value = new byte[] {(byte) 0xFF, (byte) 0xAB, 0x12, 0x25};
Identifier identifier1 = Identifier.fromBytes(value, 0, value.length, false);
byte[] bytes = identifier1.toByteArrayOfSpecifiedEndianness(true);
assertEquals("byte array is correct length", bytes.length, 4);
assertEquals("correct string representation", identifier1.toString(), "0xffab1225");
assertTrue("arrays equal", Arrays.equals(value, bytes));
assertNotSame("arrays are copied", bytes, value);
}
@Test
public void testComparableDifferentLength() {
byte[] value1 = new byte[] {(byte) 0xFF, (byte) 0xAB, 0x12, 0x25};
Identifier identifier1 = Identifier.fromBytes(value1, 0, value1.length, false);
byte[] value2 = new byte[] {(byte) 0xFF, (byte) 0xAB, 0x12, 0x25, 0x11, 0x11};
Identifier identifier2 = Identifier.fromBytes(value2, 0, value2.length, false);
assertEquals("identifier1 is smaller than identifier2", identifier1.compareTo(identifier2), -1);
assertEquals("identifier2 is larger than identifier1", identifier2.compareTo(identifier1), 1);
}
@Test
public void testComparableSameLength() {
byte[] value1 = new byte[] {(byte) 0xFF, (byte) 0xAB, 0x12, 0x25, 0x22, 0x25};
Identifier identifier1 = Identifier.fromBytes(value1, 0, value1.length, false);
byte[] value2 = new byte[] {(byte) 0xFF, (byte) 0xAB, 0x12, 0x25, 0x11, 0x11};
Identifier identifier2 = Identifier.fromBytes(value2, 0, value2.length, false);
assertEquals("identifier1 is equal to identifier2", identifier1.compareTo(identifier1), 0);
assertEquals("identifier1 is larger than identifier2", identifier1.compareTo(identifier2), 1);
assertEquals("identifier2 is smaller than identifier1", identifier2.compareTo(identifier1), -1);
}
@Test
public void testParseIntegerMaxInclusive() {
Identifier.parse("65535");
}
@Test(expected = IllegalArgumentException.class)
public void testParseIntegerAboveMax() {
Identifier.parse("65536");
}
@Test
public void testParseIntegerMinInclusive() {
Identifier.parse("0");
}
@Test(expected = IllegalArgumentException.class)
public void testParseIntegerBelowMin() {
Identifier.parse("-1");
}
@Test(expected = IllegalArgumentException.class)
public void testParseIntegerWayTooBig() {
Identifier.parse("3133742");
}
/*
* This is here because Identifier.parse wrongly accepts UUIDs without
* dashes, but we want to be backward compatible.
*/
@Test
public void testParseInvalidUuid() {
UUID ref = UUID.fromString("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6");
Identifier id = Identifier.parse("2f234454cf6d4a0fadf2f4911ba9ffa6");
assertEquals("Malformed UUID was parsed as expected.", id.toUuid(), ref);
}
@Test
public void testParseHexWithNoPrefix() {
Identifier id = Identifier.parse("abcd");
assertEquals("Should parse and get back equivalent decimal value for small numbers", "43981", id.toString());
}
@Test
public void testParseBigHexWithNoPrefix() {
Identifier id = Identifier.parse("123456789abcdef");
assertEquals("Should parse and get prefixed hex value for big numbers", "0x0123456789abcdef", id.toString());
}
@Test
public void testParseZeroPrefixedDecimalNumberAsHex() {
Identifier id = Identifier.parse("0010");
assertEquals("Should be treated as hex in parse, but converted back to decimal because it is small", "16", id.toString());
}
@Test
public void testParseNonZeroPrefixedDecimalNumberAsDecimal() {
Identifier id = Identifier.parse("10");
assertEquals("Should be treated as decimal", "10", id.toString());
}
@Test
public void testParseDecimalNumberWithSpecifiedLength() {
Identifier id = Identifier.parse("10", 8);
assertEquals("Should be treated as hex because it is long", "0x000000000000000a", id.toString());
assertEquals("Byte count should be as specified", 8, id.getByteCount());
}
@Test
public void testParseDecimalNumberWithSpecifiedShortLength() {
Identifier id = Identifier.parse("10", 2);
assertEquals("Should be treated as decimal because it is short", "10", id.toString());
assertEquals("Byte count should be as specified", 2, id.getByteCount());
}
@Test
public void testParseHexNumberWithSpecifiedLength() {
Identifier id = Identifier.parse("2fffffffffffffffffff", 10);
assertEquals("Should be treated as hex because it is long", "0x2fffffffffffffffffff", id.toString());
assertEquals("Byte count should be as specified", 10, id.getByteCount());
}
@Test
public void testParseZeroAsInteger() {
Identifier id = Identifier.parse("0");
assertEquals("Should be treated as int because it is a common integer", "0", id.toString());
assertEquals("Byte count should be 2 for integers", 2, id.getByteCount());
}
}