public void ReadWord_RightParen()
        {
            StringReader reader = new StringReader(")");
            string       word   = PartialThinning.ReadWord(reader, ')');

            Assert.AreEqual("", word);
            Assert.AreEqual(')', reader.Peek());
            Assert.AreEqual(0, reader.Index);
        }
        public void ReadWord_Range()
        {
            StringReader reader = new StringReader("40-110");
            string       word   = PartialThinning.ReadWord(reader, '(');

            Assert.AreEqual("40-110", word);
            Assert.AreEqual(-1, reader.Peek());
            Assert.AreEqual(6, reader.Index);
        }
        public void ReadWord_PercentageRightParen()
        {
            StringReader reader = new StringReader("10.5%)\t");
            string       word   = PartialThinning.ReadWord(reader, ')');

            Assert.AreEqual("10.5%", word);
            Assert.AreEqual(')', reader.Peek());
            Assert.AreEqual(5, reader.Index);
        }
        public void ReadWord_RangeWhitespace()
        {
            StringReader reader = new StringReader("1-35\t");
            string       word   = PartialThinning.ReadWord(reader, '(');

            Assert.AreEqual("1-35", word);
            Assert.AreEqual('\t', reader.Peek());
            Assert.AreEqual(4, reader.Index);
        }
        public void ReadWord_AgeWhiteSpace()
        {
            StringReader reader = new StringReader("70 ");
            string       word   = PartialThinning.ReadWord(reader, '(');

            Assert.AreEqual("70", word);
            Assert.AreEqual(' ', reader.Peek());
            Assert.AreEqual(2, reader.Index);
        }
        public void ReadWord_AgeLeftParen()
        {
            StringReader reader = new StringReader("200(75%)");
            string       word   = PartialThinning.ReadWord(reader, '(');

            Assert.AreEqual("200", word);
            Assert.AreEqual('(', reader.Peek());
            Assert.AreEqual(3, reader.Index);
        }
        public void ReadWord_Empty()
        {
            StringReader reader = new StringReader("");
            string       word   = PartialThinning.ReadWord(reader, '(');

            Assert.AreEqual("", word);
            Assert.AreEqual(-1, reader.Peek());
            Assert.AreEqual(0, reader.Index);
        }
        public void ReadWord_RangeLeftParen()
        {
            StringReader reader = new StringReader("55-90( 10%)\t");
            string       word   = PartialThinning.ReadWord(reader, '(');

            Assert.AreEqual("55-90", word);
            Assert.AreEqual('(', reader.Peek());
            Assert.AreEqual(5, reader.Index);
        }
        public void ReadPercentage_WhitespaceAfterLParen()
        {
            StringReader            reader = new StringReader("( 8%)a");
            int                     index;
            InputValue <Percentage> percentage = PartialThinning.ReadPercentage(reader, out index);

            Assert.IsNotNull(percentage);
            Assert.AreEqual("( 8%)", percentage.String);
            Assert.AreEqual(0.08, (double)(percentage.Actual));
            Assert.AreEqual(0, index);
            Assert.AreEqual('a', reader.Peek());
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Creates a cohort selection method for a specific set of ages and
        /// age ranges.
        /// </summary>
        /// <remarks>
        /// This overrides the base method so it can use the PartialThinning
        /// class to handle cohort selections with percentages.
        /// </remarks>
        protected override void CreateAdditionalCohortSelectionMethodFor(ISpecies species,
                                                                         IList <ushort> ages,
                                                                         IList <AgeRange> ranges)
        {
            if (!PartialThinning.CreateAdditionalCohortSelectorFor(species, ages, ranges))
            {
                // There were no percentages specified for this species' ages
                // and ranges.  So just create and store a whole cohort
                // selector using the base method.
                base.CreateAdditionalCohortSelectionMethodFor(species, ages, ranges);
            }
        }
        public void ReadPercentage_Whitespace()
        {
            StringReader            reader = new StringReader("( 55.5%\t)");
            int                     index;
            InputValue <Percentage> percentage = PartialThinning.ReadPercentage(reader, out index);

            Assert.IsNotNull(percentage);
            Assert.AreEqual("( 55.5%\t)", percentage.String);
            Assert.AreEqual(0.555, (double)(percentage.Actual));
            Assert.AreEqual(0, index);
            Assert.AreEqual(-1, reader.Peek());
        }
        public void ReadAgeOrRange_RangeWhitespacePercentage()
        {
            StringReader reader = new StringReader(" 1-100 (22.2%)Hi");
            int          index;

            eventHandlerCalled = false;
            expectedRange      = new AgeRange(1, 100);
            expectedPercentage = Percentage.Parse("22.2%");
            InputValue <AgeRange> ageRange = PartialThinning.ReadAgeOrRange(reader, out index);

            Assert.IsTrue(eventHandlerCalled);
            Assert.AreEqual(1, index);
            Assert.AreEqual('H', reader.Peek());
        }
        public void ReadAgeOrRange_RangePercentage()
        {
            StringReader reader = new StringReader("30-75(10%)");
            int          index;

            eventHandlerCalled = false;
            expectedRange      = new AgeRange(30, 75);
            expectedPercentage = Percentage.Parse("10%");
            InputValue <AgeRange> ageRange = PartialThinning.ReadAgeOrRange(reader, out index);

            Assert.IsTrue(eventHandlerCalled);
            Assert.AreEqual(0, index);
            Assert.AreEqual(-1, reader.Peek());
        }
        public void ReadAgeOrRange_AgeWhitespacePercentage()
        {
            StringReader reader = new StringReader("66 ( 50% )\t");
            int          index;

            eventHandlerCalled = false;
            expectedRange      = new AgeRange(66, 66);
            expectedPercentage = Percentage.Parse("50%");
            InputValue <AgeRange> ageRange = PartialThinning.ReadAgeOrRange(reader, out index);

            Assert.IsTrue(eventHandlerCalled);
            Assert.AreEqual(0, index);
            Assert.AreEqual('\t', reader.Peek());
        }
Пример #15
0
        //---------------------------------------------------------------------

        /// <summary>
        /// Creates a cohort selection method for a specific set of ages and
        /// age ranges.
        /// </summary>
        /// <remarks>
        /// This overrides the base method so it can use the PartialThinning
        /// class to handle cohort selections with percentages. Added support
        /// for InsectDefoliation via LandCover cohort selections
        /// </remarks>
        protected override void CreateCohortSelectionMethodFor(ISpecies species,
                                                               IList <ushort> ages,
                                                               IList <AgeRange> ranges)
        {
            if (LandCover.LandCover.DontParseTrees)
            {
                if (!PartialThinning.CreateCohortSelectorFor(species, ages, ranges))
                {
                    base.CreateCohortSelectionMethodFor(species, ages, ranges);
                }
            }
            else if (!LandCover.LandCover.CreateCohortSelectorFor(species, ages, ranges))
            {
                base.CreateCohortSelectionMethodFor(species, ages, ranges);
            }
        }
        public void ReadAgeOrRange_Multiple()
        {
            StringReader reader = new StringReader(" 1-40 (50%)  50(65%)\t 65-70  71-107 ( 15% )  109");
            int          index;                   //0123456789_123456789_^123456789_123456789_12345678

            eventHandlerCalled = false;
            expectedRange      = new AgeRange(1, 40);
            expectedPercentage = Percentage.Parse("50%");
            InputValue <AgeRange> ageRange = PartialThinning.ReadAgeOrRange(reader, out index);

            Assert.IsTrue(eventHandlerCalled);
            Assert.AreEqual(1, index);
            Assert.AreEqual(' ', reader.Peek());

            eventHandlerCalled = false;
            expectedRange      = new AgeRange(50, 50);
            expectedPercentage = Percentage.Parse("65%");
            ageRange           = PartialThinning.ReadAgeOrRange(reader, out index);
            Assert.IsTrue(eventHandlerCalled);
            Assert.AreEqual(13, index);
            Assert.AreEqual('\t', reader.Peek());

            eventHandlerCalled = false;
            expectedRange      = new AgeRange(65, 70);
            expectedPercentage = null;
            ageRange           = PartialThinning.ReadAgeOrRange(reader, out index);
            Assert.IsTrue(eventHandlerCalled);
            Assert.AreEqual(22, index);
            Assert.AreEqual('7', reader.Peek());

            eventHandlerCalled = false;
            expectedRange      = new AgeRange(71, 107);
            expectedPercentage = Percentage.Parse("15%");
            ageRange           = PartialThinning.ReadAgeOrRange(reader, out index);
            Assert.IsTrue(eventHandlerCalled);
            Assert.AreEqual(29, index);
            Assert.AreEqual(' ', reader.Peek());

            eventHandlerCalled = false;
            expectedRange      = new AgeRange(109, 109);
            expectedPercentage = null;
            ageRange           = PartialThinning.ReadAgeOrRange(reader, out index);
            Assert.IsTrue(eventHandlerCalled);
            Assert.AreEqual(45, index);
            Assert.AreEqual(-1, reader.Peek());
        }
        //---------------------------------------------------------------------

        private void TryReadPercentage(string input,
                                       string expectedValue,
                                       string expectedError)
        {
            StringReader reader = new StringReader(input);
            int          index;

            try {
                InputValue <Percentage> percentage = PartialThinning.ReadPercentage(reader, out index);
            }
            catch (InputValueException exc) {
                Data.Output.WriteLine();
                Data.Output.WriteLine(exc.Message);
                Assert.AreEqual(expectedValue, exc.Value);
                MultiLineText multiLineMesg = exc.MultiLineMessage;
                string        lastLine      = multiLineMesg[multiLineMesg.Count - 1];
                Assert.AreEqual(expectedError, lastLine.Trim());
                throw exc;
            }
        }
Пример #18
0
        //---------------------------------------------------------------------

        protected void ReadLandUses()
        {
            InputVar <string> name                = new InputVar <string>("LandUse");
            InputVar <ushort> mapCode             = new InputVar <ushort>("MapCode");
            InputVar <bool>   allowHarvest        = new InputVar <bool>("AllowHarvest?");
            InputVar <string> landCoverChangeType = new InputVar <string>("LandCoverChange");

            Dictionary <string, int> nameLineNumbers    = new Dictionary <string, int>();
            Dictionary <ushort, int> mapCodeLineNumbers = new Dictionary <ushort, int>();

            PartialThinning.InitializeClass();
            while (!AtEndOfInput)
            {
                int nameLineNum = LineNumber;
                ReadVar(name);
                int lineNumber;
                if (nameLineNumbers.TryGetValue(name.Value.Actual, out lineNumber))
                {
                    throw new InputValueException(name.Value.String,
                                                  "The land use \"{0}\" was previously used on line {1}",
                                                  name.Value.Actual, lineNumber);
                }
                else
                {
                    nameLineNumbers[name.Value.Actual] = nameLineNum;
                }

                int mapCodeLineNum = LineNumber;
                ReadVar(mapCode);
                if (mapCodeLineNumbers.TryGetValue(mapCode.Value.Actual, out lineNumber))
                {
                    throw new InputValueException(mapCode.Value.String,
                                                  "The map code \"{0}\" was previously used on line {1}",
                                                  mapCode.Value.Actual, lineNumber);
                }
                else
                {
                    mapCodeLineNumbers[mapCode.Value.Actual] = mapCodeLineNum;
                }

                ReadVar(allowHarvest);

                // By default, a land use allows trees to establish.
                bool allowEstablishment = true;
                if (ReadPreventEstablishment())
                {
                    allowEstablishment = false;
                }

                Dictionary <string, LandCover.IChange> landCoverChanges =
                    new Dictionary <string, LandCover.IChange>();
                List <LandCover.IChange> landCoverList = new List <LandCover.IChange>();
                ReadVar(landCoverChangeType);
                LandCover.IChange landCoverChange = ProcessLandCoverChange(landCoverChangeType);
                landCoverChanges[landCoverChange.Type] = landCoverChange;
                landCoverList.Add(landCoverChange);
                while (ReadOptionalVar(landCoverChangeType)) //Get extra LandCoverChanges
                {
                    if (landCoverChanges.TryGetValue(landCoverChangeType.Value.Actual, out landCoverChange))
                    {
                        throw new InputValueException(landCoverChangeType.Value.String,
                                                      "The land cover change \"{0}\" has already been defined for land use: {1}",
                                                      landCoverChangeType.Value.Actual, name.Value.Actual);
                    }
                    else
                    {
                        landCoverChange = ProcessLandCoverChange(landCoverChangeType);
                        landCoverChanges[landCoverChange.Type] = landCoverChange;
                        landCoverList.Add(landCoverChange);
                    }
                }

                LandCover.IChange[] changes = new LandCover.IChange[landCoverList.Count];
                for (int i = 0; i < landCoverList.Count; i++)
                {
                    changes[i] = landCoverList[i];
                }

                LandUse landUse = new LandUse(name.Value.Actual,
                                              mapCode.Value.Actual,
                                              allowHarvest.Value.Actual,
                                              allowEstablishment,
                                              changes);
                LandUseRegistry.Register(landUse);
            }
        }