Added Junits for ONAP PDP
[policy/engine.git] / ONAP-PDP / src / test / java / org / onap / policy / pdp / test / FunctionDefinitionStringConversionTest.java
diff --git a/ONAP-PDP/src/test/java/org/onap/policy/pdp/test/FunctionDefinitionStringConversionTest.java b/ONAP-PDP/src/test/java/org/onap/policy/pdp/test/FunctionDefinitionStringConversionTest.java
deleted file mode 100644 (file)
index 3268266..0000000
+++ /dev/null
@@ -1,2504 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP-PDP
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pdp.test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.math.BigInteger;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.security.auth.x500.X500Principal;
-
-import org.junit.Test;
-
-import com.att.research.xacml.api.XACML3;
-import com.att.research.xacml.std.datatypes.DataTypes;
-import com.att.research.xacml.std.datatypes.IPAddress;
-import com.att.research.xacml.std.datatypes.IPv4Address;
-import com.att.research.xacml.std.datatypes.IPv6Address;
-import com.att.research.xacml.std.datatypes.ISO8601Date;
-import com.att.research.xacml.std.datatypes.ISO8601DateTime;
-import com.att.research.xacml.std.datatypes.ISO8601Time;
-import com.att.research.xacml.std.datatypes.ISO8601TimeZone;
-import com.att.research.xacml.std.datatypes.PortRange;
-import com.att.research.xacml.std.datatypes.RFC2396DomainName;
-import com.att.research.xacml.std.datatypes.RFC822Name;
-import com.att.research.xacml.std.datatypes.XPathDayTimeDuration;
-import com.att.research.xacml.std.datatypes.XPathYearMonthDuration;
-import com.att.research.xacmlatt.pdp.policy.ExpressionResult;
-import com.att.research.xacmlatt.pdp.policy.FunctionArgument;
-import com.att.research.xacmlatt.pdp.policy.FunctionArgumentAttributeValue;
-import com.att.research.xacmlatt.pdp.std.StdFunctions;
-import com.att.research.xacmlatt.pdp.std.functions.*;
-
-/**
- * Tests for converting objects to/from Strings.
- * 
- * TO RUN - use jUnit
- * In Eclipse select this file or the enclosing directory, right-click and select Run As/JUnit Test
- * 
- *
- */
-public class FunctionDefinitionStringConversionTest {
-       
-       /*
-        * variables useful in the following tests
-        */
-       List<FunctionArgument> arguments = new ArrayList<>();
-       
-       
-       /**
-        * Boolean
-        */
-       @Test
-       public void testBoolean_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("true"));
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_BOOLEAN_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_BOOLEAN_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_BOOLEAN.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               Boolean resValue = (Boolean)res.getValue().getValue();
-               assertEquals(new Boolean(true), resValue);
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:boolean-from-string Cannot convert from \"java.lang.String\" with value \"not valid obj value\" to boolean", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:boolean-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_boolean() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "false";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_BOOLEAN.createAttributeValue(objValueString));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_BOOLEAN;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_BOOLEAN, fd.getId());
-               assertEquals(DataTypes.DT_BOOLEAN.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-boolean Expected data type 'boolean' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       /**
-        * Integer
-        */
-       @Test
-       public void testInteger_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123456"));
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_INTEGER_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_INTEGER_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_INTEGER.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               BigInteger resValue = (BigInteger)res.getValue().getValue();
-               assertEquals(new BigInteger("123456"), resValue);
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:integer-from-string For input string: \"n\"", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:integer-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_integer() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "1234";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(objValueString));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_DOUBLE.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_INTEGER;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_INTEGER, fd.getId());
-               assertEquals(DataTypes.DT_INTEGER.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-integer Expected data type 'integer' saw 'double' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       /**
-        * Double
-        */
-       @Test
-       public void testDouble_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("5.432"));
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_DOUBLE_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_DOUBLE_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_DOUBLE.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               Double resValue = (Double)res.getValue().getValue();
-               assertEquals(new Double(5.432), resValue);
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:double-from-string For input string: \"not valid obj value\"", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:double-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_double() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrObjBig = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "5.432";
-               String objValueStringBig = "55555555555555555555.123455";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_DOUBLE.createAttributeValue(objValueString));
-                       attrObjBig = new FunctionArgumentAttributeValue(DataTypes.DT_DOUBLE.createAttributeValue(objValueStringBig));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_DOUBLE;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DOUBLE, fd.getId());
-               assertEquals(DataTypes.DT_DOUBLE.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               arguments.clear();
-               arguments.add(attrObjBig);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("5.555555555555556E19", res.getValue().getValue());
-               
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-double Expected data type 'double' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       
-       /**
-        * Time
-        */
-       @Test
-       public void testTime_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrString2 = null;
-               FunctionArgumentAttributeValue attrString3 = null;
-               FunctionArgumentAttributeValue attrString4 = null;
-               FunctionArgumentAttributeValue attrStringTimeZone = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("05:12:34.323"));
-                       attrString2 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("5:12:34.323"));
-                       attrString3 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("05:12"));
-                       attrString4 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("05:12:34"));
-                       attrStringTimeZone = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("05:12:34.323+03:00"));
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_TIME_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_TIME_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_TIME.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               ISO8601Time resValue = (ISO8601Time)res.getValue().getValue();
-               assertEquals(new ISO8601Time(5, 12, 34, 323), resValue);
-               
-               // check missing 0 in front
-               arguments.clear();
-               arguments.add(attrString2);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:time-from-string Invalid hour of day", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // check missing seconds/msecs
-               arguments.clear();
-               arguments.add(attrString3);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:time-from-string Time string too short", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // check missing just msecs
-               arguments.clear();
-               arguments.add(attrString4);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601Time)res.getValue().getValue();
-               assertEquals(new ISO8601Time(5, 12, 34, 0), resValue);
-               
-               // check TimeZone
-               arguments.clear();
-               arguments.add(attrStringTimeZone);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601Time)res.getValue().getValue();
-               assertEquals(new ISO8601Time(new ISO8601TimeZone(180), 5, 12, 34, 323), resValue);
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:time-from-string Invalid hour of day", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:time-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_time() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrObj2 = null;
-               FunctionArgumentAttributeValue attrObjTimeZone = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_TIME.createAttributeValue("05:12:34.323"));
-                       attrObj2 = new FunctionArgumentAttributeValue(DataTypes.DT_TIME.createAttributeValue("05:01:02.323"));
-                       attrObjTimeZone = new FunctionArgumentAttributeValue(DataTypes.DT_TIME.createAttributeValue("05:12:34.323+03:00"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_TIME;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_TIME, fd.getId());
-               assertEquals(DataTypes.DT_TIME.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("05:12:34.323", res.getValue().getValue());
-               
-               // missing digits in string value?
-               arguments.clear();
-               arguments.add(attrObj2);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("05:01:02.323", res.getValue().getValue());
-               
-               // include TimeZone
-               arguments.clear();
-               arguments.add(attrObjTimeZone);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("05:12:34.323+03:00", res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-time Expected data type 'time' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       
-       /**
-        * Date
-        */
-       @Test
-       public void testDate_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrString2 = null;
-               FunctionArgumentAttributeValue attrString3 = null;
-               FunctionArgumentAttributeValue attrString4 = null;
-               FunctionArgumentAttributeValue attrString5 = null;
-               FunctionArgumentAttributeValue attrString6 = null;
-               FunctionArgumentAttributeValue attrString7 = null;
-               FunctionArgumentAttributeValue attrString8 = null;
-               FunctionArgumentAttributeValue attrString9 = null;
-               FunctionArgumentAttributeValue attrStringDateZone = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-05-12"));
-                       attrString2 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("-2013-05-12"));
-                       attrString3 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("1232013-05-12"));
-                       attrString4 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("-1232013-05-12"));
-                       attrString5 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("213-05-12"));
-                       attrString6 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-5-12"));
-                       attrString7 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-05-2"));
-                       attrString8 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-32-12"));
-                       attrString9 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-05-45"));
-                       attrStringDateZone = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-05-12+03:00"));
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_DATE_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_DATE_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_DATE.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               ISO8601Date resValue = (ISO8601Date)res.getValue().getValue();
-               assertEquals(new ISO8601Date(2013, 5, 12), resValue);
-               
-               // check negative
-               arguments.clear();
-               arguments.add(attrString2);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601Date)res.getValue().getValue();
-               assertEquals(new ISO8601Date(-2013, 5, 12), resValue);
-               
-               // check big
-               arguments.clear();
-               arguments.add(attrString3);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601Date)res.getValue().getValue();
-               assertEquals(new ISO8601Date(1232013, 5, 12), resValue);
-               
-               // check big negative
-               arguments.clear();
-               arguments.add(attrString4);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601Date)res.getValue().getValue();
-               assertEquals(new ISO8601Date(-1232013, 5, 12), resValue);
-               
-               // bad year
-               arguments.clear();
-               arguments.add(attrString5);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:date-from-string Invalid year (must be at least 4 digits)", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // bad month
-               arguments.clear();
-               arguments.add(attrString6);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:date-from-string Invalid month", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // bad day format
-               arguments.clear();
-               arguments.add(attrString7);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:date-from-string Invalid day", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // month out of range
-               arguments.clear();
-               arguments.add(attrString8);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:date-from-string Invalid month", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // day out of range
-               arguments.clear();
-               arguments.add(attrString9);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:date-from-string Invalid day", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               
-               // check TimeZone
-               arguments.clear();
-               arguments.add(attrStringDateZone);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601Date)res.getValue().getValue();
-               assertEquals(new ISO8601Date(new ISO8601TimeZone(180), 2013, 5, 12), resValue);
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:date-from-string Invalid year", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:date-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_date() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrObj2 = null;
-               FunctionArgumentAttributeValue attrObjDateZone = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_DATE.createAttributeValue("2013-05-12"));
-                       attrObj2 = new FunctionArgumentAttributeValue(DataTypes.DT_DATE.createAttributeValue("0001-01-01"));
-                       attrObjDateZone = new FunctionArgumentAttributeValue(DataTypes.DT_DATE.createAttributeValue("2013-05-12+03:00"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_DATE;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DATE, fd.getId());
-               assertEquals(DataTypes.DT_DATE.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("2013-05-12", res.getValue().getValue());
-               
-               // missing digits in string value?
-               arguments.clear();
-               arguments.add(attrObj2);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("1-01-01", res.getValue().getValue());
-               
-               // include DateZone
-               arguments.clear();
-               arguments.add(attrObjDateZone);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("2013-05-12+03:00", res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-date Expected data type 'date' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       
-
-       /**
-        * DateTime
-        */
-       @Test
-       public void testDateTime_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrString2 = null;
-               FunctionArgumentAttributeValue attrString3 = null;
-               FunctionArgumentAttributeValue attrString4 = null;
-               FunctionArgumentAttributeValue attrString5 = null;
-               FunctionArgumentAttributeValue attrString6 = null;
-               FunctionArgumentAttributeValue attrString7 = null;
-               FunctionArgumentAttributeValue attrString8 = null;
-               FunctionArgumentAttributeValue attrString9 = null;
-               FunctionArgumentAttributeValue attrStringDateTimeZone = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-05-12T12:14:15.323"));
-                       attrString2 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("-2013-05-12T12:14:15.323"));
-                       attrString3 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("1232013-05-12T12:14:15.323"));
-                       attrString4 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("-1232013-05-12T12:14:15.323"));
-                       attrString5 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("213-05-12T12:14:15.323"));
-                       attrString6 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-5-12T12:14:15.323"));
-                       attrString7 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-05-2T12:14:15.323"));
-                       attrString8 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-32-12T12:14:15.323"));
-                       attrString9 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-05-45T12:14:15.323"));
-                       attrStringDateTimeZone = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2013-05-12T12:14:15.323+03:00"));
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_DATETIME_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_DATETIME_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_DATETIME.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               ISO8601DateTime resValue = (ISO8601DateTime)res.getValue().getValue();
-               assertEquals(new ISO8601DateTime(null, new ISO8601Date(2013, 5, 12), new ISO8601Time(12, 14, 15, 323)), resValue);
-               
-               // check negative
-               arguments.clear();
-               arguments.add(attrString2);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601DateTime)res.getValue().getValue();
-               assertEquals(new ISO8601DateTime(null, new ISO8601Date(-2013, 5, 12), new ISO8601Time(12, 14, 15, 323)), resValue);
-               
-               
-               // check big
-               arguments.clear();
-               arguments.add(attrString3);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601DateTime)res.getValue().getValue();
-               assertEquals(new ISO8601DateTime(null, new ISO8601Date(1232013, 5, 12), new ISO8601Time(12, 14, 15, 323)), resValue);
-               
-               // check big negative
-               arguments.clear();
-               arguments.add(attrString4);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601DateTime)res.getValue().getValue();
-               assertEquals(new ISO8601DateTime(null, new ISO8601Date(-1232013, 5, 12), new ISO8601Time(12, 14, 15, 323)), resValue);
-               
-               // bad year
-               arguments.clear();
-               arguments.add(attrString5);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dateTime-from-string Invalid year (must be at least 4 digits)", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // bad month
-               arguments.clear();
-               arguments.add(attrString6);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dateTime-from-string Invalid month", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // bad day format
-               arguments.clear();
-               arguments.add(attrString7);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dateTime-from-string Invalid day", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // month out of range
-               arguments.clear();
-               arguments.add(attrString8);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dateTime-from-string Invalid month", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               // day out of range
-               arguments.clear();
-               arguments.add(attrString9);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dateTime-from-string Invalid day", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-
-               
-               // check TimeZone
-               arguments.clear();
-               arguments.add(attrStringDateTimeZone);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (ISO8601DateTime)res.getValue().getValue();
-               assertEquals(new ISO8601DateTime(new ISO8601TimeZone(180), new ISO8601Date(new ISO8601TimeZone(180), 2013, 5, 12), new ISO8601Time(new ISO8601TimeZone(180),12, 14, 15, 323)), resValue);
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dateTime-from-string Invalid year", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dateTime-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_dateTime() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrObj2 = null;
-               FunctionArgumentAttributeValue attrObjDateTimeZone = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_DATETIME.createAttributeValue("2013-05-12T12:14:15.323"));
-                       attrObj2 = new FunctionArgumentAttributeValue(DataTypes.DT_DATETIME.createAttributeValue("0001-01-01T12:14:15.323"));
-                       attrObjDateTimeZone = new FunctionArgumentAttributeValue(DataTypes.DT_DATETIME.createAttributeValue("2013-05-12T12:14:15.323+03:00"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_DATETIME;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DATETIME, fd.getId());
-               assertEquals(DataTypes.DT_DATETIME.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("2013-05-12T12:14:15.323", res.getValue().getValue());
-               
-               // missing digits in string value?
-               arguments.clear();
-               arguments.add(attrObj2);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("1-01-01T12:14:15.323", res.getValue().getValue());
-               
-               // include DateTimeZone
-               arguments.clear();
-               arguments.add(attrObjDateTimeZone);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("2013-05-12T12:14:15.323+03:00", res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-dateTime Expected data type 'dateTime' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       
-       /**
-        * URI
-        */
-       @Test
-       public void testURI_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("http://someMachine.com/subdir"));
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_ANYURI_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_ANYURI_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_ANYURI.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               URI resValue = (URI)res.getValue().getValue();
-               try {
-                       assertEquals(new URI("http://someMachine.com/subdir"), resValue);
-               } catch (URISyntaxException e) {
-                       fail("uri generation e="+e);
-               }
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:anyURI-from-string Illegal character in path at index 3: not valid obj value", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:anyURI-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_anyURI() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "http://aMachine.com:8080/aRef";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_ANYURI.createAttributeValue(objValueString));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_ANYURI;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_ANYURI, fd.getId());
-               assertEquals(DataTypes.DT_ANYURI.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-anyURI Expected data type 'anyURI' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       /**
-        * XPathDayTimeDuration
-        */
-       @Test
-       public void testXPathDayTimeDuration_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringNeg1 = null;
-               FunctionArgumentAttributeValue attrStringNeg2 = null;
-               FunctionArgumentAttributeValue attrStringNoDay = null;
-               FunctionArgumentAttributeValue attrStringNoHour = null;
-               FunctionArgumentAttributeValue attrStringNoMin = null;
-               FunctionArgumentAttributeValue attrStringNoSec = null;
-               FunctionArgumentAttributeValue attrStringNoP = null;
-               FunctionArgumentAttributeValue attrStringSecondsDot = null;
-               FunctionArgumentAttributeValue attrStringMissingTOk = null;
-               FunctionArgumentAttributeValue attrStringMissingTBad = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3DT10H30M23S"));
-                       attrStringNeg1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("-P3DT10H30M23S"));
-                       attrStringNeg2 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P-3DT10H30M23S"));
-                       attrStringNoDay = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("PT10H30M23S"));
-                       attrStringNoHour = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3DT30M23S"));
-                       attrStringNoMin = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3DT10H23S"));
-                       attrStringNoSec = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3DT10H30M"));
-                       attrStringNoP = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("3DT10H30M"));
-                       attrStringSecondsDot = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3DT10H30M23.456S"));
-                       attrStringMissingTOk = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3D"));
-                       attrStringMissingTBad = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3D10H30M23S"));
-
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_DAYTIMEDURATION_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_DAYTIMEDURATION_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_DAYTIMEDURATION.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               XPathDayTimeDuration resValue = (XPathDayTimeDuration)res.getValue().getValue();
-               assertEquals(new XPathDayTimeDuration(1, 3, 10, 30, 23), resValue);
-               
-               
-               //              negative values in front is allowed
-               arguments.clear();
-               arguments.add(attrStringNeg1);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathDayTimeDuration)res.getValue().getValue();
-               assertEquals(new XPathDayTimeDuration(-1, 3, 10, 30, 23), resValue);
-               
-               // negative in middle of string not ok
-               arguments.clear();
-               arguments.add(attrStringNeg2);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dayTimeDuration-from-string Invalid chunk \"P-3DT10H30M23S\" at position 1", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               //      omit parts that are 0
-               arguments.clear();
-               arguments.add(attrStringNoDay);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathDayTimeDuration)res.getValue().getValue();
-               assertEquals(new XPathDayTimeDuration(1, 0, 10, 30, 23), resValue);
-               
-               arguments.clear();
-               arguments.add(attrStringNoHour);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathDayTimeDuration)res.getValue().getValue();
-               assertEquals(new XPathDayTimeDuration(1, 3, 0, 30, 23), resValue);
-               
-               arguments.clear();
-               arguments.add(attrStringNoMin);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathDayTimeDuration)res.getValue().getValue();
-               assertEquals(new XPathDayTimeDuration(1, 3, 10, 0, 23), resValue);
-               
-               arguments.clear();
-               arguments.add(attrStringNoSec);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathDayTimeDuration)res.getValue().getValue();
-               assertEquals(new XPathDayTimeDuration(1, 3, 10, 30, 0), resValue);
-               
-               //              P must always be present
-               arguments.clear();
-               arguments.add(attrStringNoP);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dayTimeDuration-from-string Invalid ISO8601 duration string \"3DT10H30M\" at position 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               //              seconds may contain decimal
-               arguments.clear();
-               arguments.add(attrStringSecondsDot);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathDayTimeDuration)res.getValue().getValue();
-               assertEquals(new XPathDayTimeDuration(1, 3, 10, 30, 23.456), resValue);
-               
-               //              T must be absent iff all time items are absent
-               arguments.clear();
-               arguments.add(attrStringMissingTOk);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathDayTimeDuration)res.getValue().getValue();
-               assertEquals(new XPathDayTimeDuration(1, 3, 0, 0, 0), resValue);
-               
-               // negative in middle of string not ok
-               arguments.clear();
-               arguments.add(attrStringMissingTBad);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dayTimeDuration-from-string Invalid ISO8601 duration string \"P3D10H30M23S\" at position 6: out of order component", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dayTimeDuration-from-string Invalid ISO8601 duration string \"not valid obj value\" at position 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dayTimeDuration-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_dayTimeDuration() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "P3DT10H30M23S";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_DAYTIMEDURATION.createAttributeValue(objValueString));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_DAYTIMEDURATION;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DAYTIMEDURATION, fd.getId());
-               assertEquals(DataTypes.DT_DAYTIMEDURATION.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-dayTimeDuration Expected data type 'dayTimeDuration' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       
-       
-       
-       
-       
-       /**
-        * XPathYearMonthDuration
-        */
-       @Test
-       public void testXPathYearMonthDuration_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringNeg1 = null;
-               FunctionArgumentAttributeValue attrStringNeg2 = null;
-               FunctionArgumentAttributeValue attrStringNoYear1 = null;
-               FunctionArgumentAttributeValue attrStringNoYear2 = null;
-               FunctionArgumentAttributeValue attrStringNoMonth1 = null;
-               FunctionArgumentAttributeValue attrStringNoMonth2 = null;
-               FunctionArgumentAttributeValue attrStringNoValue = null;
-               FunctionArgumentAttributeValue attrStringNoP = null;
-               FunctionArgumentAttributeValue attrStringBigMonths = null;
-               FunctionArgumentAttributeValue attrStringMissingTOk = null;
-               FunctionArgumentAttributeValue attrStringMissingTBad = null;
-               FunctionArgumentAttributeValue attrStringZeroMonths = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P1Y2M"));
-                       attrStringNeg1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("-P1Y2M"));
-                       attrStringNeg2 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P-1Y2M"));
-                       attrStringNoYear1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P2M"));
-                       attrStringNoYear2 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("PY2M"));
-                       attrStringNoMonth1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P1Y"));
-                       attrStringNoMonth2 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P1YM"));
-                       attrStringNoValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P"));
-                       attrStringNoP = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("1Y2M"));
-                       attrStringBigMonths = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P1Y12M"));
-                       attrStringMissingTOk = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3D"));
-                       attrStringMissingTBad = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P3D10H30M23S"));
-                       attrStringZeroMonths = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("P0M"));
-
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_YEARMONTHDURATION_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_YEARMONTHDURATION_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_YEARMONTHDURATION.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               XPathYearMonthDuration resValue = (XPathYearMonthDuration)res.getValue().getValue();
-               assertEquals(new XPathYearMonthDuration(1,1, 2), resValue);
-               
-               
-               //              negative values in front is allowed
-               arguments.clear();
-               arguments.add(attrStringNeg1);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathYearMonthDuration)res.getValue().getValue();
-               assertEquals(new XPathYearMonthDuration(-1, 1, 2), resValue);
-               
-               // negative in middle of string not ok
-               arguments.clear();
-               arguments.add(attrStringNeg2);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Invalid chunk \"P-1Y2M\" at position 1", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               //      omit parts that are 0
-               arguments.clear();
-               arguments.add(attrStringNoYear1);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathYearMonthDuration)res.getValue().getValue();
-               assertEquals(new XPathYearMonthDuration(1, 0, 2), resValue);
-               
-               arguments.clear();
-               arguments.add(attrStringNoYear2);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Invalid chunk \"PY2M\" at position 1", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               arguments.clear();
-               arguments.add(attrStringNoMonth1);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathYearMonthDuration)res.getValue().getValue();
-               assertEquals(new XPathYearMonthDuration(1, 1, 0), resValue);
-               
-               arguments.clear();
-               arguments.add(attrStringNoMonth2);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Invalid chunk \"P1YM\" at position 3", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // No field with a value 
-               arguments.clear();
-               arguments.add(attrStringNoValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Invalid ISO8601 duration string \"P\": No duration components following P", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               //              P must always be present
-               arguments.clear();
-               arguments.add(attrStringNoP);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Invalid ISO8601 duration string \"1Y2M\" at position 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               //              Canonical Form of output may not have more than 12 months, but input as string is ok?
-               arguments.clear();
-               arguments.add(attrStringBigMonths);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathYearMonthDuration)res.getValue().getValue();
-               assertEquals(new XPathYearMonthDuration(1, 1, 12), resValue);
-               
-               // Canonical representation of 0 Months
-               arguments.clear();
-               arguments.add(attrStringZeroMonths);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (XPathYearMonthDuration)res.getValue().getValue();
-               assertEquals(new XPathYearMonthDuration(1, 0, 0), resValue);
-               
-               //              T must be absent iff all time items are absent
-               arguments.clear();
-               arguments.add(attrStringMissingTOk);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Invalid XPath yearMonthDuraiton \"{durationSign=1years=0months=0days=3hours=0minutes=0seconds=0millis=0}\": includes days, hours, minutes, or seconds", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // negative in middle of string not ok
-               arguments.clear();
-               arguments.add(attrStringMissingTBad);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Invalid ISO8601 duration string \"P3D10H30M23S\" at position 6: out of order component", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Invalid ISO8601 duration string \"not valid obj value\" at position 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:yearMonthDuration-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_yearMonthDuration() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "P1Y2M";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_YEARMONTHDURATION.createAttributeValue(objValueString));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_YEARMONTHDURATION;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_YEARMONTHDURATION, fd.getId());
-               assertEquals(DataTypes.DT_YEARMONTHDURATION.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-yearMonthDuration Expected data type 'yearMonthDuration' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-
-
-       
-       
-       /**
-        * X500Principal
-        * 
-        * See http://www.ietf.org/rfc/rfc2253.txt and http://www.ietf.org/rfc/rfc2251.txt
-        */
-       @Test
-       public void testX500Principal_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringNoComma = null;
-               FunctionArgumentAttributeValue attrStringEmpty = null;
-               FunctionArgumentAttributeValue attrStringNoValue = null;
-               FunctionArgumentAttributeValue attrStringOrder = null;
-               FunctionArgumentAttributeValue attrStringDottedDecimalOID = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("CN=Name, L=local, ST=NJ, O=ATT, C=USA"));
-                       attrStringNoComma = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("CN=Name, L=local ST=NJ, O=ATT, C=USA"));
-                       attrStringEmpty = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(""));
-                       attrStringNoValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("CN=Name, L=, ST=NJ, O=ATT, C=USA"));
-                       attrStringOrder = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("L=local, ST=NJ, O=ATT, CN=Name, C=USA"));
-                       attrStringDottedDecimalOID = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2.5.4.3=A. N. Other"));
-
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_X500NAME_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_X500NAME_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_X500NAME.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               X500Principal resValue = (X500Principal)res.getValue().getValue();
-               assertEquals(new X500Principal("CN=Name, L=local, ST=NJ, O=ATT, C=USA"), resValue);
-               
-               // no comma between components => next attribute/value is included as part of first value
-               arguments.clear();
-               arguments.add(attrStringNoComma);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (X500Principal)res.getValue().getValue();
-               assertEquals(new X500Principal("CN=Name, L=local ST=NJ, O=ATT, C=USA"), resValue);
-               
-               // nothing in name (fail)
-               arguments.clear();
-               arguments.add(attrStringEmpty);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (X500Principal)res.getValue().getValue();
-               assertEquals(new X500Principal(""), resValue);
-               
-               // type value with no =
-               arguments.clear();
-               arguments.add(attrStringNoValue);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (X500Principal)res.getValue().getValue();
-               assertEquals(new X500Principal("CN=Name, L=, ST=NJ, O=ATT, C=USA"), resValue);
-               
-               // different order
-               arguments.clear();
-               arguments.add(attrStringOrder);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (X500Principal)res.getValue().getValue();
-               assertNotEquals(new X500Principal("CN=Name, L=local, ST=NJ, O=ATT, C=USA"), resValue);
-       
-               // dotted-decimal name with numbers
-               arguments.clear();
-               arguments.add(attrStringDottedDecimalOID);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (X500Principal)res.getValue().getValue();
-               assertEquals(new X500Principal("2.5.4.3=A. N. Other"), resValue);
-               
-
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:x500Name-from-string improperly specified input name: not valid obj value", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:x500Name-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_x500Name() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "CN=Name, L=local, ST=NJ, O=ATT, C=USA";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_X500NAME.createAttributeValue(objValueString));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_X500NAME;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_X500NAME, fd.getId());
-               assertEquals(DataTypes.DT_X500NAME.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-x500Name Expected data type 'x500Name' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       
-       
-       
-       /**
-        * RFC822Name
-        */
-       @Test
-       public void testRFC822Name_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringCapsDomain = null;
-               FunctionArgumentAttributeValue attrStringCapsLocal = null;
-               FunctionArgumentAttributeValue attrStringMissingAt = null;
-               FunctionArgumentAttributeValue attrStringMissingLocal = null;
-               FunctionArgumentAttributeValue attrStringMissingDomain = null;
-               FunctionArgumentAttributeValue attrStringEmpty = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("local@Domain"));
-                       attrStringCapsDomain = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("local@DOMAIN"));
-                       attrStringCapsLocal = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("LOCAL@Domain"));
-                       attrStringMissingAt = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("localDomain"));
-                       attrStringMissingLocal = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("@Domain"));
-                       attrStringMissingDomain = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("local@"));
-                       attrStringEmpty = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(""));
-                       
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_RFC822NAME_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_RFC822NAME_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_RFC822NAME.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               RFC822Name resValue = (RFC822Name)res.getValue().getValue();
-               assertEquals(new RFC822Name("local", "domain"), resValue);
-               
-               // caps domain
-               arguments.clear();
-               arguments.add(attrStringCapsDomain);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (RFC822Name)res.getValue().getValue();
-               assertEquals(new RFC822Name("local", "domain"), resValue);
-               
-               // caps local
-               arguments.clear();
-               arguments.add(attrStringCapsLocal);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (RFC822Name)res.getValue().getValue();
-               assertNotEquals(new RFC822Name("local", "domain"), resValue);
-               
-               // missing at
-               arguments.clear();
-               arguments.add(attrStringMissingAt);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"localDomain\": missing local part", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // missing local
-               arguments.clear();
-               arguments.add(attrStringMissingLocal);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"@Domain\": empty parts", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // missing domain
-               arguments.clear();
-               arguments.add(attrStringMissingDomain);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"local@\": empty parts", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // empty
-               arguments.clear();
-               arguments.add(attrStringEmpty);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"\": missing local part", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"not valid obj value\": missing local part", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:rfc822Name-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_rfc822Name() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "local@DOMAIN";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_RFC822NAME.createAttributeValue(objValueString));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_RFC822NAME;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_RFC822NAME, fd.getId());
-               assertEquals(DataTypes.DT_RFC822NAME.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals("local@domain", res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-rfc822Name Expected data type 'rfc822Name' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       /**
-        * IPAddress
-        */
-       @Test
-       public void testIPAddress_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrStringFull = null;
-               FunctionArgumentAttributeValue attrStringMissingElement = null;
-               FunctionArgumentAttributeValue attrStringTooManyElement = null;
-               FunctionArgumentAttributeValue attrStringIllegalElement = null;
-               FunctionArgumentAttributeValue attrStringOutOfOrder = null;
-               
-               FunctionArgumentAttributeValue attrStringMask = null;
-               FunctionArgumentAttributeValue attrStringMissingMaskElement = null;
-               FunctionArgumentAttributeValue attrStringTooManyMaskElement = null;
-               FunctionArgumentAttributeValue attrStringIllegalMaskElement = null;
-               FunctionArgumentAttributeValue attrStringMaskNoValue = null;
-               
-               FunctionArgumentAttributeValue attrStringMinusPort = null;
-               FunctionArgumentAttributeValue attrStringPortMinus = null;
-               FunctionArgumentAttributeValue attrStringPortPort = null;
-               FunctionArgumentAttributeValue attrStringNoPort = null;
-               FunctionArgumentAttributeValue attrStringBadPort = null;
-               FunctionArgumentAttributeValue attrStringTooManyPorts = null;
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               
-               // set up for v4 address tests - this setup and the tests are repeated for V6
-               short[] addrShorts= {123, 134, 156, 255 };
-               short[] addrMaskShorts= {255, 255, 255, 255 };
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255"));
-                       attrStringFull = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255/255.255.255.255:123-456"));
-                       attrStringMissingElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.255"));
-                       attrStringTooManyElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.255.111.222"));
-                       attrStringIllegalElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.256.255"));
-                       attrStringOutOfOrder = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.256.255:123-456/255.255.255.255"));
-
-                       attrStringMask = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255/255.255.255.255"));
-                       attrStringMissingMaskElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255/123.134.255"));
-                       attrStringTooManyMaskElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255/122.134.155.111.222"));
-                       attrStringIllegalMaskElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255/123.134.256.255"));
-                       attrStringMaskNoValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255/"));
-                       // optional mask
-                       // "/" with no mask (fail)
-
-                       attrStringMinusPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255:-123"));
-                       attrStringPortMinus = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255:123-"));
-                       attrStringPortPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255:1234567-432"));
-                       attrStringNoPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255:"));
-                       attrStringBadPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255:12.34"));
-                       attrStringTooManyPorts = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("123.134.156.255:-123-456"));
-
-
-                       
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_IPADDRESS_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_IPADDRESS_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_IPADDRESS.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               IPAddress resValue = (IPAddress)res.getValue().getValue();
-               assertEquals(new IPv4Address(addrShorts, null, null), resValue);
-
-               // fully-loaded address
-               arguments.clear();
-               arguments.add(attrStringFull);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv4Address(addrShorts, addrMaskShorts, PortRange.newInstance("123-456")), resValue);
-               } catch (Exception e) {
-                       fail("port error e="+e);
-               }
-               
-               // missing element
-               arguments.clear();
-               arguments.add(attrStringMissingElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.255\": invalid address", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // too many elements
-               arguments.clear();
-               arguments.add(attrStringTooManyElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.255.111.222\": invalid address", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // illegal element
-               arguments.clear();
-               arguments.add(attrStringIllegalElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.256.255\": invalid octet: \"256", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // Out of order
-               arguments.clear();
-               arguments.add(attrStringOutOfOrder);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.256.255:123-456/255.255.255.255\": out of order components", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // simple mask
-               arguments.clear();
-               arguments.add(attrStringMask);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv4Address(addrShorts, addrMaskShorts, null), resValue);
-               } catch (Exception e) {
-                       fail("port error e="+e);
-               }
-               
-               // missing mask element
-               arguments.clear();
-               arguments.add(attrStringMissingMaskElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.255\": invalid address", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // too many mask elements
-               arguments.clear();
-               arguments.add(attrStringTooManyMaskElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"122.134.155.111.222\": invalid address", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // illegal Mask element
-               arguments.clear();
-               arguments.add(attrStringIllegalMaskElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.256.255\": invalid octet: \"256", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               //mask indicator without value
-               arguments.clear();
-               arguments.add(attrStringMaskNoValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"\": invalid address", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // portrange (-port, port-, port-port)
-               arguments.clear();
-               arguments.add(attrStringMinusPort);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv4Address(addrShorts, null, PortRange.newInstance("-123")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               arguments.clear();
-               arguments.add(attrStringPortMinus);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv4Address(addrShorts, null, PortRange.newInstance("123-")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               arguments.clear();
-               arguments.add(attrStringPortPort);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv4Address(addrShorts, null, PortRange.newInstance("1234567-432")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               // ":" without port
-               arguments.clear();
-               arguments.add(attrStringNoPort);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.156.255:\": no portrange given after ':'", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // bad port number
-               arguments.clear();
-               arguments.add(attrStringBadPort);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid PortRange \"12.34\": invalid port number", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad port range
-               arguments.clear();
-               arguments.add(attrStringTooManyPorts);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid PortRange \"-123-456\": too many ranges", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Unknown IPAddress type for \"not valid obj value\"", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       
-       
-               //
-               // V6 IP Addresses
-               //
-               
-               // reset the variable for IPv6 tests
-               FunctionArgumentAttributeValue attrStringAlternateFull = null;
-               FunctionArgumentAttributeValue attrStringEmptyElement = null;
-               FunctionArgumentAttributeValue attrString2xEmptyElement = null;
-               FunctionArgumentAttributeValue attrStringNoStartBracket = null;
-               FunctionArgumentAttributeValue attrStringNoEndBracket = null;
-               short[] addrv6Shorts = {(short)0x2001, (short)0xdb8, (short)0x85a3, (short)0x0, (short)0x0, (short)0x8a2e, (short)0x370, (short)0x1};
-               Short prefix = new Short((short) 121);
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]"));
-                       attrStringFull = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1/121]:123-456"));
-                       attrStringAlternateFull = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]/121:123-456"));
-                       attrStringEmptyElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3::8a2e:370:1]"));
-                       attrString2xEmptyElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3::8a2e::1]"));
-                       attrStringNoStartBracket = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("2002:db8:85a3::8a2e::1]"));
-                       attrStringNoEndBracket = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3::8a2e::1"));
-
-                       attrStringMissingElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:1]"));
-                       attrStringTooManyElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1:123]"));
-                       attrStringIllegalElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:mnop:85a3:0:0:8a2e:370:1]"));
-                       attrStringOutOfOrder = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:mnop:85a3:0:0:8a2e:370:1:123-456/121]"));
-
-                       attrStringMask = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1/21]"));
-                       attrStringIllegalMaskElement = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1/130]"));
-                       attrStringMaskNoValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1/]"));
-
-                       attrStringMinusPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:-123"));
-                       attrStringPortMinus = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:123-"));
-                       attrStringPortPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:1234567-432"));
-                       attrStringNoPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:"));
-                       attrStringBadPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:12.34"));
-                       attrStringTooManyPorts = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:-123-456"));
-
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-       
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               assertEquals(new IPv6Address(addrv6Shorts, null, null), resValue);
-
-               // fully-loaded address - "prefix" is inside the brackets (not clear if this is correct)
-               arguments.clear();
-               arguments.add(attrStringFull);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv6Address(addrv6Shorts, new Short(prefix), PortRange.newInstance("123-456")), resValue);
-               } catch (Exception e) {
-                       fail("port error e="+e);
-               }
-               
-               // Alternate way of identifying "prefix" - outside the brackets
-               arguments.clear();
-               arguments.add(attrStringAlternateFull);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv6Address(addrv6Shorts, prefix, PortRange.newInstance("123-456")), resValue);
-               } catch (Exception e) {
-                       fail("port error e="+e);
-               }
-               
-               
-               // consecutive zero elements removed
-               arguments.clear();
-               arguments.add(attrStringEmptyElement);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv6Address(addrv6Shorts, prefix, null), resValue);
-               } catch (Exception e) {
-                       fail("port error e="+e);
-               }
-               
-               // consecutive zero elements removed in two locations (no-no)
-               arguments.clear();
-               arguments.add(attrString2xEmptyElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2001:db8:85a3::8a2e::1\": multiple zero runs", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // address must have [] on it
-               arguments.clear();
-               arguments.add(attrStringNoStartBracket);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2002:db8:85a3::8a2e::1]\": missing opening bracket", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               arguments.clear();
-               arguments.add(attrStringNoEndBracket);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"[2001:db8:85a3::8a2e::1\": missing closing bracket", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // missing element
-               arguments.clear();
-               arguments.add(attrStringMissingElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2001:db8:85a3:0:0:8a2e:1\": not enough address fields", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // too many elements
-               arguments.clear();
-               arguments.add(attrStringTooManyElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2001:db8:85a3:0:0:8a2e:370:1:123\"", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // illegal element
-               arguments.clear();
-               arguments.add(attrStringIllegalElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv6Address component \"mnop\": invalid hex", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // Out of order
-               arguments.clear();
-               arguments.add(attrStringOutOfOrder);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2001:mnop:85a3:0:0:8a2e:370:1:123-456\"", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // simple mask
-               arguments.clear();
-               arguments.add(attrStringMask);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv6Address(addrv6Shorts, prefix, null), resValue);
-               } catch (Exception e) {
-                       fail("port error e="+e);
-               }
-               
-               // illegal Mask element
-               arguments.clear();
-               arguments.add(attrStringIllegalMaskElement);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid Ipv6Address string \"[2001:db8:85a3:0:0:8a2e:370:1/130]\": prefix is larger than 128", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               //mask indicator without value
-               arguments.clear();
-               arguments.add(attrStringMaskNoValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid Ipv6Address string \"[2001:db8:85a3:0:0:8a2e:370:1/]\": prefix designation without value", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // portrange (-port, port-, port-port)
-               arguments.clear();
-               arguments.add(attrStringMinusPort);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv6Address(addrv6Shorts, null, PortRange.newInstance("-123")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               arguments.clear();
-               arguments.add(attrStringPortMinus);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv6Address(addrv6Shorts, null, PortRange.newInstance("123-")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               arguments.clear();
-               arguments.add(attrStringPortPort);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (IPAddress)res.getValue().getValue();
-               try {
-                       assertEquals(new IPv6Address(addrv6Shorts, null, PortRange.newInstance("1234567-432")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               // ":" without port
-               arguments.clear();
-               arguments.add(attrStringNoPort);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid IPv6 address string \"[2001:db8:85a3:0:0:8a2e:370:1]:\": no portrange given after ':'", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-               // bad port number
-               arguments.clear();
-               arguments.add(attrStringBadPort);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid PortRange \"12.34\": invalid port number", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad port range
-               arguments.clear();
-               arguments.add(attrStringTooManyPorts);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:ipAddress-from-string Invalid PortRange \"-123-456\": too many ranges", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               
-       
-       
-       
-       }
-
-       @Test
-       public void testString_from_ipAddress() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrObjV6 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "123.145.255.255";
-               String objValueStringV6 = "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_IPADDRESS.createAttributeValue(objValueString));
-                       attrObjV6 = new FunctionArgumentAttributeValue(DataTypes.DT_IPADDRESS.createAttributeValue(objValueStringV6));
-                       
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_IPADDRESS;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_IPADDRESS, fd.getId());
-               assertEquals(DataTypes.DT_IPADDRESS.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal V4
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               // test normal V6
-               arguments.clear();
-               arguments.add(attrObjV6);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueStringV6.toLowerCase(), res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-ipAddress Expected data type 'ipAddress' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       
-       
-       
-       
-       
-       
-       /**
-        * RFC2396DomainName
-        */
-       @Test
-       public void testRFC2396DomainName_from_string() {
-               FunctionArgumentAttributeValue attrString1 = null;
-               FunctionArgumentAttributeValue attrString2 = null;
-               FunctionArgumentAttributeValue attrStringMinusPort = null;
-               FunctionArgumentAttributeValue attrStringPortMinus = null;
-               FunctionArgumentAttributeValue attrStringPortPort = null;
-               FunctionArgumentAttributeValue attrStringNoPort = null;
-               FunctionArgumentAttributeValue attrStringBadPort = null;
-               FunctionArgumentAttributeValue attrStringTooManyPorts = null;
-       
-               FunctionArgumentAttributeValue attrStringBadValue = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               try {
-                       attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host"));
-                       attrString2 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host.host"));
-               
-                       attrStringMinusPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host.host:-123"));
-                       attrStringPortMinus = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host.host:123-"));
-                       attrStringPortPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host.host:1234567-432"));
-                       attrStringNoPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host.host:"));
-                       attrStringBadPort = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host.host:12.34"));
-                       attrStringTooManyPorts = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host.host:-123-456"));
-               
-                       attrStringBadValue = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("not valid obj value"));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_DNSNAME_FROM_STRING;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_DNSNAME_FROM_STRING, fd.getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_DNSNAME.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrString1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               RFC2396DomainName resValue = (RFC2396DomainName)res.getValue().getValue();
-               assertEquals(new RFC2396DomainName("host", null), resValue);
-               
-               arguments.clear();
-               arguments.add(attrString2);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (RFC2396DomainName)res.getValue().getValue();
-               assertEquals(new RFC2396DomainName("host.host", null), resValue);
-               
-
-               // portrange (-port, port-, port-port)
-               arguments.clear();
-               arguments.add(attrStringMinusPort);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (RFC2396DomainName)res.getValue().getValue();
-               try {
-                       assertEquals(new RFC2396DomainName("host.host", PortRange.newInstance("-123")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               arguments.clear();
-               arguments.add(attrStringPortMinus);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (RFC2396DomainName)res.getValue().getValue();
-               try {
-                       assertEquals(new RFC2396DomainName("host.host", PortRange.newInstance("123-")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               arguments.clear();
-               arguments.add(attrStringPortPort);
-               res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               resValue = (RFC2396DomainName)res.getValue().getValue();
-               try {
-                       assertEquals(new RFC2396DomainName("host.host", PortRange.newInstance("1234567-432")), resValue);
-               } catch (ParseException e) {
-                       fail("port error e="+e);
-               }
-               
-               // ":" without port
-               arguments.clear();
-               arguments.add(attrStringNoPort);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dnsName-from-string Invalid RFC 2396 port range \"host.host:\": no port numbers", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad port number
-               arguments.clear();
-               arguments.add(attrStringBadPort);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dnsName-from-string Invalid RFC 2396 port range \"12.34\"", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad port range
-               arguments.clear();
-               arguments.add(attrStringTooManyPorts);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dnsName-from-string Invalid RFC 2396 port range \"-123-456\"", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad value
-               arguments.clear();
-               arguments.add(attrStringBadValue);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dnsName-from-string Invalid RFC 2396 host name \"not valid obj value\"", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:dnsName-from-string Expected data type 'string' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-
-       @Test
-       public void testString_from_dnsName() {
-               FunctionArgumentAttributeValue attrObj1 = null;
-               FunctionArgumentAttributeValue attrStringBadType = null;
-               String objValueString = "someName.com";
-               try {
-                       attrObj1 = new FunctionArgumentAttributeValue(DataTypes.DT_DNSNAME.createAttributeValue(objValueString));
-                       attrStringBadType = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(123));
-
-               } catch (Exception e) {
-                       fail("creating attribute e="+ e);
-               }
-               
-               FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>) StdFunctions.FD_STRING_FROM_DNSNAME;
-               
-               // check identity and type of the thing created
-               assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DNSNAME, fd.getId());
-               assertEquals(DataTypes.DT_DNSNAME.getId(), fd.getDataTypeArgs().getId());
-               assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
-               
-               // just to be safe...  If tests take too long these can probably be eliminated
-               assertFalse(fd.returnsBag());
-               assertEquals(new Integer(1), fd.getNumArgs());
-               
-               // test normal
-               arguments.clear();
-               arguments.add(attrObj1);
-               ExpressionResult res = fd.evaluate(null, arguments);
-               assertTrue(res.isOk());
-               assertEquals(objValueString, res.getValue().getValue());
-               
-               // bad arg type
-               arguments.clear();
-               arguments.add(attrStringBadType);
-               res = fd.evaluate(null, arguments);
-               assertFalse(res.isOk());
-               assertEquals("function:string-from-dnsName Expected data type 'dnsName' saw 'integer' at arg index 0", res.getStatus().getStatusMessage());
-               assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode().getStatusCodeValue().stringValue());
-       }
-       
-       
-       
-       
-       
-       
-       
-}