public void CountWithMinParserTest()
        {
            CountWithMin countWithMinOf1     = new CountWithMin(1);
            CountWithMin countWithMinOf99999 = new CountWithMin(99999);

            TestUtil.TestPropertyParser("1-*", countWithMinOf1);
            TestUtil.TestPropertyParser("\t\t  1-* \n\n \t", countWithMinOf1);

            TestUtil.TestPropertyParser("99999-*", countWithMinOf99999);
            TestUtil.TestPropertyParser("\t\t  99999-* \n\n \t", countWithMinOf99999);

            //
            // Test that it disallows CountWithMin(0)
            //
            #if DEBUG
            try
            {
                CountWithMin countWithMin = new CountWithMin(0);
                Assert.Fail();
            }
            catch (ArgumentOutOfRangeException e)
            {
                Console.WriteLine(String.Format("Caught expected exception {0}", e));
            }
            #endif

            //
            // Test some larger Count with min
            //
            for (UInt32 i = 1; i < 1000000; i += 95416)
            {
                CountWithMin countWithMin = (CountWithMin)CountProperty.Parse(i.ToString() + "-*");
                Assert.AreEqual(i, countWithMin.min);
            }
        }
        public void CountWithMinAndMaxParserTest()
        {
            CountWithMinAndMax countWithMinAndMaxA = new CountWithMinAndMax(1, 2);
            CountWithMinAndMax countWithMinAndMaxB = new CountWithMinAndMax(4, 9938);

            TestUtil.TestPropertyParser("1-2", countWithMinAndMaxA);
            TestUtil.TestPropertyParser("\t\t  1-2 \n\n \t", countWithMinAndMaxA);

            TestUtil.TestPropertyParser("4-9938", countWithMinAndMaxB);
            TestUtil.TestPropertyParser("\t\t  4-9938 \n\n \t", countWithMinAndMaxB);


            //
            // Test that it disallows certain min/max pairs
            //
            try
            {
                CountWithMinAndMax countWithMinAndMax = new CountWithMinAndMax(2, 1);
                Assert.Fail();
            }
            catch (ArgumentException e)
            {
                Console.WriteLine(String.Format("Caught expected exception {0}", e));
            }
            try
            {
                CountWithMinAndMax countWithMinAndMax = new CountWithMinAndMax(999, 999);
                Assert.Fail();
            }
            catch (ArgumentException e)
            {
                Console.WriteLine(String.Format("Caught expected exception {0}", e));
            }

            //
            // Test some larger values
            //
            for (UInt32 i = 1; i < 1000000; i += 95416)
            {
                for (UInt32 j = i + 1; j < 1000000; j += 95416)
                {
                    CountWithMinAndMax countWithMinAndMax = (CountWithMinAndMax)CountProperty.Parse(String.Format("{0}-{1}", i, j));
                    Assert.AreEqual(i, countWithMinAndMax.min);
                    Assert.AreEqual(j, countWithMinAndMax.max);
                }
            }
        }
        public void CountWithMaxParserTest()
        {
            CountWithMax countWithMaxOf1     = new CountWithMax(1);
            CountWithMax countWithMaxOf83729 = new CountWithMax(83729);

            TestUtil.TestPropertyParser("0-1", countWithMaxOf1);
            TestUtil.TestPropertyParser("\t\t  0-1 \n\n \t", countWithMaxOf1);

            TestUtil.TestPropertyParser("0-83729", countWithMaxOf83729);
            TestUtil.TestPropertyParser("\t\t  0-83729 \n\n \t", countWithMaxOf83729);


            //
            // Test that it disallows CountWithMax(0)
            //
            #if DEBUG
            try
            {
                CountWithMax countWithMax = new CountWithMax(0);
                Assert.Fail();
            }
            catch (ArgumentOutOfRangeException e)
            {
                Console.WriteLine(String.Format("Caught expected exception {0}", e));
            }
            #endif

            //
            // Test some larger Count with max
            //
            for (UInt32 i = 1; i < 1000000; i += 95416)
            {
                CountWithMax countWithMax = (CountWithMax)CountProperty.Parse("0-" + i.ToString());
                Assert.AreEqual(i, countWithMax.max);
            }
        }
        public void StaticCountParserTest()
        {
            StaticCount static0Count     = new StaticCount(0);
            StaticCount static939Count   = new StaticCount(939);
            StaticCount static65535Count = new StaticCount(65535);

            TestUtil.TestPropertyParser("0", static0Count);
            TestUtil.TestPropertyParser("\t\t  0 \n\n \t", static0Count);

            TestUtil.TestPropertyParser("939", static939Count);
            TestUtil.TestPropertyParser("\t\t  939 \n\n \t", static939Count);

            TestUtil.TestPropertyParser("      65535", static65535Count);
            TestUtil.TestPropertyParser("   \t\t    65535 \n   \n  \t", static65535Count);

            //
            // Test some larger static counts
            //
            for (UInt32 i = 0; i < 1000000; i += 95416)
            {
                StaticCount staticCount = (StaticCount)CountProperty.Parse(i.ToString());
                Assert.AreEqual(i, staticCount.count);
            }
        }
Ejemplo n.º 5
0
        public static void ParseAndOverrideBlockProperties(HmdBlockIDProperties blockIDProperties, String props)
        {
            if (blockIDProperties == null)
            {
                throw new ArgumentNullException("blockIDProperties");
            }

            ICountProperty countPropertyOverride = null;

            HmdParentReference[] parentOverrideList = null;

            Int32 offset = 0, saveOffset;

            //
            // TODO: To save on memory, maybe I'll add some type of hash lookup so I don't have to instantiate multiple HmdType classes?
            //
            while (true)
            {
                while (true)
                {
                    if (offset >= props.Length)
                    {
                        if (countPropertyOverride != null)
                        {
                            blockIDProperties.OverrideCountProperty(countPropertyOverride);
                        }
                        if (parentOverrideList != null)
                        {
                            blockIDProperties.SetParentOverrideList(parentOverrideList);
                        }
                        return;
                    }
                    if (!Char.IsWhiteSpace(props[offset]))
                    {
                        break;
                    }
                    offset++;
                }

                if (props[offset] >= '0' && props[offset] <= '9')
                {
                    saveOffset = offset;

                    // keep going while you see 0-9, '-' or '*'
                    do
                    {
                        offset++;
                        if (offset >= props.Length)
                        {
                            break;
                        }
                    } while ((props[offset] >= '0' && props[offset] <= '9') || props[offset] == '-' || props[offset] == '*');

                    //
                    // Check that the 'count' property has not been specified Twice
                    //
                    if (countPropertyOverride != null)
                    {
                        throw new FormatException("You've specified the 'count' property twice!");
                    }
                    countPropertyOverride = CountProperty.Parse(props.Substring(saveOffset, offset - saveOffset));
                }
                else if (props[offset] == '(')
                {
                    if (parentOverrideList != null)
                    {
                        throw new FormatException("You've specified the 'parents' property twice!");
                    }

                    parentOverrideList = ParseParentList(props, ref offset);
                }
                else
                {
                    throw new FormatException(String.Format("Could not recognize first character of property '{0}', of the props string \"{1}\"",
                                                            props[offset], props));
                }
            }
        }
Ejemplo n.º 6
0
        //
        // Maybe change to pass in the string offset and length?
        //
        public static HmdValueIDProperties ParseValueProperties(String idString, String props, HmdBlockIDProperties definitionParent, HmdProperties hmdProperties)
        {
            if (idString == null)
            {
                throw new ArgumentNullException("idString");
            }

            Boolean defaultCountPropertyOverriden = false;
            Boolean defaultHmdTypeOverriden       = false;

            ICountProperty countProperty = hmdProperties.defaultCountProperty;
            HmdType        hmdType       = hmdProperties.defaultHmdType;

            HmdEnumReference enumReference = null;

            HmdParentReference[] parentOverrideList = null;

            Int32 offset = 0, saveOffset;

            //
            // TODO: To save on memory, maybe I'll add some type of hash lookup so I don't have to instantiate multiple HmdType classes?
            //
            while (true)
            {
                while (true)
                {
                    if (offset >= props.Length)
                    {
                        return(new HmdValueIDProperties(idString, countProperty, hmdType, enumReference,
                                                        definitionParent, parentOverrideList));
                    }
                    if (!Char.IsWhiteSpace(props[offset]))
                    {
                        break;
                    }
                    offset++;
                }

                if (props[offset] >= '0' && props[offset] <= '9')
                {
                    saveOffset = offset;

                    // keep going while you see 0-9, '-' or '*'
                    do
                    {
                        offset++;
                        if (offset >= props.Length)
                        {
                            break;
                        }
                    } while ((props[offset] >= '0' && props[offset] <= '9') || props[offset] == '-' || props[offset] == '*');

                    //
                    // Check that the 'count' property has not been specified Twice
                    //
                    if (defaultCountPropertyOverriden)
                    {
                        throw new FormatException("You've specified the 'count' property twice!");
                    }
                    defaultCountPropertyOverriden = true;

                    countProperty = CountProperty.Parse(props.Substring(saveOffset, offset - saveOffset));
                }
                else if (props[offset] == 's')
                {
                    if (offset + 6 > props.Length) // 6 = "string".Length
                    {
                        throw new FormatException(String.Format("Found character '{0}', expected to become \"{1}\", but there are some characters missing",
                                                                HmdTypeClass.String[0], HmdTypeClass.String));
                    }

                    if (props[offset + 1] != 't' ||
                        props[offset + 2] != 'r' ||
                        props[offset + 3] != 'i' ||
                        props[offset + 4] != 'n' ||
                        props[offset + 5] != 'g')
                    {
                        throw new FormatException(String.Format("Expected 'string', but got '{0}'", props.Substring(offset, 6)));
                    }

                    offset += 6;

                    //
                    // Check that the 'type' property has not been specified Twice
                    //
                    if (defaultHmdTypeOverriden)
                    {
                        throw new FormatException("You've specified the 'type' property twice!");
                    }
                    defaultHmdTypeOverriden = true;

                    hmdType = HmdType.String;
                }
                else if (props[offset] == HmdTypeClass.Boolean[0])
                {
                    if (offset + HmdTypeClass.Boolean.Length > props.Length)
                    {
                        throw new FormatException(
                                  String.Format("Found character '{0}', expected to become \"{1}\", but there are some characters missing",
                                                HmdTypeClass.Boolean[0], HmdTypeClass.Boolean));
                    }
                    offset++;
                    for (int i = 1; i < HmdTypeClass.Boolean.Length; i++)
                    {
                        if (props[offset] != HmdTypeClass.Boolean[i])
                        {
                            throw new FormatException(String.Format("Expected \"{0}\", but got \"{1}\"", HmdTypeClass.Boolean, props.Substring(offset - i, HmdTypeClass.Boolean.Length)));
                        }
                        offset++;
                    }

                    //
                    // Check that the 'type' property has not been specified Twice
                    //
                    if (defaultHmdTypeOverriden)
                    {
                        throw new FormatException("You've specified the 'type' property twice!");
                    }
                    defaultHmdTypeOverriden = true;

                    hmdType = HmdType.Boolean;
                }
                else if (props[offset] == 'i' || props[offset] == 'u')
                {
                    Byte    byteSize;
                    Boolean isUnsigned = false;
                    if (props[offset] == 'u')
                    {
                        isUnsigned = true;
                        offset++;
                        if (props[offset] != 'i')
                        {
                            throw new FormatException(
                                      String.Format("Found character 'u', expected to become \"uint\", but the next character was '{0}'", props[offset]));
                        }
                    }

                    if (offset + 3 > props.Length)
                    {
                        throw new FormatException(
                                  String.Format("Found character '{0}', expected to become \"{1}\", but there are some characters missing",
                                                isUnsigned ? 'u' : 'i', isUnsigned ? "uint" : "int"));
                    }

                    if (props[offset + 1] != 'n' || props[offset + 2] != 't')
                    {
                        throw new FormatException(String.Format("Expected \"{0}\", but got \"{1}\"",
                                                                isUnsigned ? "uint" : "int", isUnsigned ? props.Substring(offset - 1, 4) : props.Substring(offset, 3)));
                    }

                    offset += 3;

                    if (offset < props.Length && props[offset] >= '0' && props[offset] <= '9')
                    {
                        saveOffset = offset;
                        do
                        {
                            offset++;
                        } while (offset < props.Length && props[offset] >= '0' && props[offset] <= '9');
                        byteSize = Byte.Parse(props.Substring(saveOffset, offset - saveOffset));
                    }
                    else
                    {
                        byteSize = 0;
                    }

                    //
                    // Check that the 'type' property has not been specified Twice
                    //
                    if (defaultHmdTypeOverriden)
                    {
                        throw new FormatException("You've specified the 'type' property twice!");
                    }
                    defaultHmdTypeOverriden = true;

                    hmdType = HmdTypeClass.GetIntegerType(isUnsigned, byteSize);
                }
                else if (props[offset] == 'e')
                {
                    offset++;
                    if (offset >= props.Length)
                    {
                        throw new FormatException("Found character 'e', expected to become \"enum\" or \"empty\" but the string abrubtly ended");
                    }

                    if (props[offset] == HmdTypeClass.Empty[1])
                    {
                        if (offset + HmdTypeClass.Empty.Length - 1 > props.Length)
                        {
                            throw new FormatException("Found \"em\", expected to become \"empty\", but there are some characters missing");
                        }
                        offset++;
                        for (int i = 2; i < HmdTypeClass.Empty.Length; i++)
                        {
                            if (props[offset] != HmdTypeClass.Empty[i])
                            {
                                throw new FormatException(String.Format("Expected \"{0}\", but got \"{1}\"", HmdTypeClass.Empty, props.Substring(offset - i, HmdTypeClass.Empty.Length)));
                            }
                            offset++;
                        }

                        //
                        // Check that the 'type' property has not been specified Twice
                        //
                        if (defaultHmdTypeOverriden)
                        {
                            throw new FormatException("You've specified the 'type' property twice!");
                        }
                        defaultHmdTypeOverriden = true;

                        hmdType = HmdType.Empty;
                    }
                    else if (props[offset] == HmdTypeClass.Enumeration[1])
                    {
                        if (offset + HmdTypeClass.Enumeration.Length + 1 > props.Length)
                        {
                            throw new FormatException(
                                      String.Format("Found \"en\", expected to become \"{0}\", but there are some characters missing",
                                                    HmdTypeClass.Enumeration));
                        }
                        offset++;
                        for (int i = 2; i < HmdTypeClass.Enumeration.Length; i++)
                        {
                            if (props[offset] != HmdTypeClass.Enumeration[i])
                            {
                                throw new FormatException(String.Format("Expected \"{0}\", but got \"{1}\"", HmdTypeClass.Enumeration, props.Substring(offset - i, HmdTypeClass.Enumeration.Length)));
                            }
                            offset++;
                        }

                        // skip whitespace
                        while (true)
                        {
                            if (offset >= props.Length)
                            {
                                throw new FormatException("Expected '(' or 'a-zA-Z', but got EOF");
                            }
                            if (!Char.IsWhiteSpace(props[offset]))
                            {
                                break;
                            }
                            offset++;
                        }

                        if (props[offset] == '(')
                        {
                            saveOffset = offset + 1;
                            // skip to the next whitespace or ';'
                            while (true)
                            {
                                offset++;
                                if (offset >= props.Length)
                                {
                                    throw new FormatException("Expected ')' but reached end of string");
                                }
                                if (props[offset] == ')')
                                {
                                    break;
                                }
                            }

                            String enumReferenceName = (definitionParent == null || definitionParent.definitionContext == null) ?
                                                       idString.ToLower() : HmdIDProperties.CombineIDContext(definitionParent.idWithContext, idString.ToLower());
                            HmdEnum newInlineEnum = new HmdEnum(enumReferenceName, props.Substring(saveOffset, offset - saveOffset));

                            enumReference = newInlineEnum;
                            if (hmdProperties != null)
                            {
                                hmdProperties.AddEnum(newInlineEnum);
                            }

                            offset++;

                            if (defaultHmdTypeOverriden)
                            {
                                throw new FormatException("You've specified the 'type' property twice!");
                            }
                            defaultHmdTypeOverriden = true;
                            hmdType = HmdType.Enumeration;
                        }
                        else if ((props[offset] >= 'a' && props[offset] <= 'z') || (props[offset] >= 'A' && props[offset] <= 'Z'))
                        {
                            saveOffset = offset;
                            // skip to the next whitespace or ';'
                            while (true)
                            {
                                offset++;
                                if (offset >= props.Length)
                                {
                                    break;
                                }
                                if (Char.IsWhiteSpace(props[offset]))
                                {
                                    break;
                                }
                            }
                            if (offset - saveOffset <= 0)
                            {
                                throw new FormatException("Unable to parse enum type, the \"enum\" keyword must be either \"enum <type>\" (with only one space before <type>) or \"enum(<value> <value> ...)\"");
                            }

                            enumReference = new HmdEnumReferenceByString(props.Substring(saveOffset, offset - saveOffset));

                            if (defaultHmdTypeOverriden)
                            {
                                throw new FormatException("You've specified the 'type' property twice!");
                            }
                            defaultHmdTypeOverriden = true;
                            hmdType = HmdType.Enumeration;
                        }
                        else
                        {
                            throw new FormatException(String.Format("Expected '(' or 'a-zA-Z' after \"enum\", but got '{0}'", props[offset]));
                        }
                    }
                    else
                    {
                        throw new FormatException(String.Format(
                                                      "Found character 'e', expected to become \"enum\" or \"empty\" but the second character is '{0}'", props[offset]));
                    }
                }
                else if (props[offset] == '(')
                {
                    if (parentOverrideList != null)
                    {
                        throw new FormatException("You've specified the 'parents' property twice!");
                    }

                    parentOverrideList = ParseParentList(props, ref offset);
                }
                else
                {
                    throw new FormatException(
                              String.Format("Could not recognize first character of property '{0}', of the props string \"{1}\"", props[offset], props));
                }
            }
        }