/*******************************************************************************
* Copyright 2015 Analog Devices, Inc.
*
* 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.analog.lyric.dimple.test.model.core;
import static com.analog.lyric.dimple.model.core.Ids.*;
import static com.analog.lyric.util.test.ExceptionTester.*;
import static org.junit.Assert.*;
import java.util.UUID;
import org.junit.Test;
import com.analog.lyric.dimple.environment.DimpleEnvironment;
import com.analog.lyric.dimple.model.core.IFactorGraphChild;
import com.analog.lyric.dimple.model.core.Ids;
import com.analog.lyric.dimple.model.core.Ids.Type;
import com.analog.lyric.dimple.model.core.Node;
import com.analog.lyric.dimple.model.variables.Variable;
import com.analog.lyric.dimple.test.DimpleTestBase;
/**
* Test for Ids static methods
* <p>
* @since 0.08
* @author Christopher Barber
*/
public class TestNodeId extends DimpleTestBase
{
@Test
public void test()
{
testForIndex(LOCAL_ID_INDEX_MIN);
testForIndex(LOCAL_ID_INDEX_MAX);
for (int i = 0; i < 100; ++i)
{
final int index =
LOCAL_ID_INDEX_MIN + testRand.nextInt(1 + LOCAL_ID_INDEX_MAX + LOCAL_ID_INDEX_MIN);
testForIndex(index);
}
int bogusTypeLocalId = 0xF0000003;
assertEquals("$X3", defaultNameForLocalId(bogusTypeLocalId));
assertEquals(-1, localIdFromDefaultName(""));
assertEquals(-1, localIdFromDefaultName("barf"));
assertEquals(-1, localIdFromDefaultName("$Vxxx"));
assertEquals(-1, localIdFromDefaultName("$W42"));
assertEquals(-1, localIdFromDefaultName("$X3"));
assertEquals(-1, localIdFromDefaultName("$v42"));
assertEquals(-1, localIdFromDefaultName("$$42"));
assertEquals(-1, localIdFromDefaultName("$A-42"));
assertEquals(-1, localIdFromDefaultName("$V268435456")); // index too large
assertEquals(-1, graphIdFromDefaultName(""));
assertEquals(-1, graphIdFromDefaultName("$Graph"));
assertEquals(-1, graphIdFromDefaultName("$Graph-42"));
assertEquals(-1, graphIdFromDefaultName("$Graph1073741824")); // id too large
assertEquals(-1L, envIdFromUUID(UUID.randomUUID()));
assertEquals(-1L, envIdFromUUID(new UUID(0,0)));
assertEquals(-1L, globalIdFromUUID(UUID.randomUUID()));
assertEquals(-1L, globalIdFromUUID(new UUID(0,0)));
assertFalse(isUUIDString(UUID.randomUUID().toString()));
assertTrue(isUUIDString("00000000-0000-D000-8000-000000000000"));
assertTrue(isUUIDString("00000000-0000-d000-9000-000000000000"));
assertTrue(isUUIDString("00000000-0000-D000-A000-000000000000"));
assertTrue(isUUIDString("00000000-0000-d000-B000-000000000000"));
assertFalse(isUUIDString("00000000-0000-0000-0000-000000000000"));
assertFalse(isUUIDString("00000000-0000-0000-D000-000000000000"));
assertFalse(isUUIDString("00000000=0000-D000-8000-000000000000"));
assertFalse(isUUIDString("00000000-0000=D000-8000-000000000000"));
assertFalse(isUUIDString("00000000-0000-D000=8000-000000000000"));
assertFalse(isUUIDString("00000000-0000-D000-8000=000000000000"));
assertFalse(isUUIDString("00000000-0000-D000-C000-000000000000"));
assertFalse(isUUIDString("*0000000-0000-D000-8000-000000000000"));
assertFalse(isUUIDString("0g000000-0000-D000-8000-000000000000"));
assertFalse(isUUIDString("00G00000-0000-D000-8000-000000000000"));
assertFalse(isUUIDString("000@0000-0000-D000-8000-000000000000"));
// Test exceptions
expectThrow(IllegalArgumentException.class, Ids.Type.class, "forInstanceClass", Node.class);
abstract class BogusChildClass implements IFactorGraphChild {}
expectThrow(IllegalArgumentException.class, Ids.Type.class, "forInstanceClass", BogusChildClass.class);
}
private void testForIndex(int index)
{
for (int typeIndex = TYPE_MIN; typeIndex <= TYPE_MAX; ++typeIndex)
{
Ids.Type type = Ids.Type.valueOf(typeIndex);
assertEquals(typeIndex, type.ordinal());
assertEquals(typeIndex, type.typeIndex());
Class<? extends IFactorGraphChild> instanceClass = type.instanceClass();
if (type == Ids.Type.BOUNDARY_VARIABLE)
{
assertSame(Variable.class, instanceClass);
}
else
{
assertEquals(type, Ids.Type.forInstanceClass(instanceClass));
}
int localId = localIdFromParts(typeIndex, index);
assertEquals(index, indexFromLocalId(localId));
assertEquals(typeIndex, typeIndexFromLocalId(localId));
assertEquals(Type.valueOf(typeIndex), typeFromLocalId(localId));
String name = defaultNameForLocalId(localId);
assertFalse(isUUIDString(name));
assertEquals(localId, localIdFromDefaultName(name));
int graphId = GRAPH_ID_MIN + testRand.nextInt(1 + GRAPH_ID_MAX - GRAPH_ID_MIN);
long globalId = globalIdFromParts(graphId, localId);
long globalId2 = globalIdFromParts(graphId, typeIndex, localId);
assertEquals(globalId, globalId2);
assertTrue(GLOBAL_ID_MIN <= globalId);
assertTrue(GLOBAL_ID_MAX >= globalId);
assertTrue(isGlobalId(globalId));
assertEquals(graphId, graphIdFromGlobalId(globalId));
assertEquals(localId, localIdFromGlobalId(globalId));
String graphName = defaultNameForGraphId(graphId);
assertEquals(graphId, graphIdFromDefaultName(graphName));
int graphTreeIndex = testRand.nextInt(Short.MAX_VALUE);
long graphTreeId = graphTreeIdFromParts(graphTreeIndex, localId);
assertEquals(graphTreeIndex, graphTreeIndexFromGraphTreeId(graphTreeId));
assertEquals(localId, localIdFromGraphTreeId(graphTreeId));
assertFalse(isGlobalId(graphTreeId));
long envId = DimpleEnvironment.active().getEnvId();
UUID uuid = makeUUID(envId, globalId);
assertEquals(globalId, globalIdFromUUID(uuid));
assertEquals(envId, envIdFromUUID(uuid));
assertTrue(isUUIDString(uuid.toString()));
assertTrue(isUUIDString(uuid.toString().toLowerCase()));
}
}
}