@Test
public void testUserType() throws Exception {
MidPointPrismContextFactory factory = getContextFactory();
PrismContext context = factory.createInitializedPrismContext();
SchemaRegistry schemaRegistry = context.getSchemaRegistry();
PrismObjectDefinition<UserType> userDefinition = schemaRegistry.findObjectDefinitionByCompileTimeClass(UserType.class);
assertNotNull("No user definition", userDefinition);
System.out.println("testUserType:");
System.out.println(userDefinition.debugDump());
assertFalse("User definition is marked as runtime", userDefinition.isRuntimeSchema());
PrismPropertyDefinition<PolyString> nameDef = userDefinition.findPropertyDefinition(ObjectType.F_NAME);
assertNotNull("No name definition", nameDef);
PrismContainerDefinition extensionDef = userDefinition.findContainerDefinition(UserType.F_EXTENSION);
assertNotNull("No 'extension' definition", extensionDef);
assertTrue("Extension definition is NOT marked as runtime", extensionDef.isRuntimeSchema());
PrismPropertyDefinition<PolyString> givenNameDef = userDefinition.findPropertyDefinition(UserType.F_GIVEN_NAME);
assertNotNull("No givenName definition", givenNameDef);
PrismPropertyDefinition<String> preferredLanguageDef = userDefinition.findPropertyDefinition(UserType.F_PREFERRED_LANGUAGE);
assertNotNull("No preferredLanguage definition", preferredLanguageDef);
PrismReferenceValue preferredLanguageValueEnumerationRef = preferredLanguageDef.getValueEnumerationRef();
assertNotNull("No valueEnumerationRef in preferredLanguage definition", preferredLanguageValueEnumerationRef);
assertEquals("Wrong OID in valueEnumerationRef in preferredLanguage definition",
SystemObjectsType.LOOKUP_LANGUAGES.value(), preferredLanguageValueEnumerationRef.getOid());
assertEquals("Wrong type in valueEnumerationRef in preferredLanguage definition",
LookupTableType.COMPLEX_TYPE, preferredLanguageValueEnumerationRef.getTargetType());
PrismObjectDefinition<UserType> shallowClone = userDefinition.clone();
PrismObjectDefinition<UserType> deepClone = userDefinition.deepClone(false, null);
PrismObjectDefinition<UserType> ultraDeepClone = userDefinition.deepClone(true, null);
}