public void ListWithOneChildSecurity()
        {
            var listingDate = new Date(2000, 01, 01);

            var stock = new StapledSecurity(Guid.NewGuid());

            var childSecurities = new StapledSecurityChild[]
            {
                new StapledSecurityChild("ABC_1", "Child 1", true)
            };

            stock.List("ABC", "ABC Pty Ltd", listingDate, AssetCategory.AustralianProperty, childSecurities);

            using (new AssertionScope())
            {
                stock.Should().BeEquivalentTo(new
                {
                    Trust           = false,
                    EffectivePeriod = new DateRange(listingDate, Date.MaxValue)
                });

                stock.RelativeNTAs[listingDate].Percentages.Should().Equal(new decimal[] { 1.00m });

                stock.ChildSecurities.Should().SatisfyRespectively(
                    first => first.Should().BeEquivalentTo(new
                {
                    AsxCode = "ABC_1",
                    Name    = "Child 1",
                    Trust   = true
                }));
            }
        }
        public void DeListWithoutBeingListed()
        {
            var listingDate   = new Date(2000, 01, 01);
            var delistingDate = new Date(2002, 01, 01);

            var stock = new StapledSecurity(Guid.NewGuid());

            Action a = () => stock.DeList(delistingDate);

            a.Should().Throw <EffectiveDateException>();
        }
        public void ListWhenAlreadyListed()
        {
            var listingDate = new Date(2000, 01, 01);

            var stock = new StapledSecurity(Guid.NewGuid());

            stock.List("ABC", "ABC Pty Ltd", listingDate, AssetCategory.AustralianProperty, new StapledSecurityChild[0]);

            Action a = () => stock.List("XYZ", "XYZ Pty Ltd", listingDate, AssetCategory.AustralianProperty, new StapledSecurityChild[0]);

            a.Should().Throw <EffectiveDateException>();
        }
        public void SetRelativeNTAsPercentagesDontAddTo100()
        {
            var listingDate = new Date(2000, 01, 01);
            var changeDate  = new Date(2002, 01, 01);

            var stock = new StapledSecurity(Guid.NewGuid());

            var childSecurities = new StapledSecurityChild[]
            {
                new StapledSecurityChild("ABC_1", "Child 1", true),
                new StapledSecurityChild("ABC_2", "Child 2", false)
            };

            stock.List("ABC", "ABC Pty Ltd", listingDate, AssetCategory.AustralianProperty, childSecurities);

            Action a = () => stock.SetRelativeNTAs(changeDate, new decimal[] { 0.60m, 0.60m });

            a.Should().Throw <ArgumentException>();
        }
        public void SetRelativeNTAsBeforeListing()
        {
            var listingDate = new Date(2000, 01, 01);
            var changeDate  = new Date(1999, 01, 01);

            var stock = new StapledSecurity(Guid.NewGuid());

            var childSecurities = new StapledSecurityChild[]
            {
                new StapledSecurityChild("ABC_1", "Child 1", true),
                new StapledSecurityChild("ABC_2", "Child 2", false)
            };

            stock.List("ABC", "ABC Pty Ltd", listingDate, AssetCategory.AustralianProperty, new StapledSecurityChild[0]);

            Action a = () => stock.SetRelativeNTAs(changeDate, new decimal[] { 0.50m, 0.50m });

            a.Should().Throw <EffectiveDateException>();
        }
        public void SetRelativeNTAsTwiceOnSameDay()
        {
            var listingDate = new Date(2000, 01, 01);
            var changeDate  = new Date(2002, 01, 01);

            var stock = new StapledSecurity(Guid.NewGuid());

            var childSecurities = new StapledSecurityChild[]
            {
                new StapledSecurityChild("ABC_1", "Child 1", true),
                new StapledSecurityChild("ABC_2", "Child 2", false)
            };

            stock.List("ABC", "ABC Pty Ltd", listingDate, AssetCategory.AustralianProperty, childSecurities);

            stock.SetRelativeNTAs(changeDate, new decimal[] { 0.30m, 0.70m });
            stock.SetRelativeNTAs(changeDate, new decimal[] { 0.60m, 0.40m });

            stock.RelativeNTAs[changeDate].Percentages.Should().Equal(new decimal[] { 0.60m, 0.40m });
        }
        public void DeList()
        {
            var listingDate   = new Date(2000, 01, 01);
            var delistingDate = new Date(2002, 01, 01);

            var stock = new StapledSecurity(Guid.NewGuid());

            stock.List("ABC", "ABC Pty Ltd", listingDate, AssetCategory.AustralianProperty, new StapledSecurityChild[0]);
            stock.DeList(delistingDate);

            using (new AssertionScope())
            {
                stock.Should().BeEquivalentTo(new
                {
                    Trust           = false,
                    EffectivePeriod = new DateRange(listingDate, delistingDate)
                });

                stock.Properties.Values.Last().EffectivePeriod.ToDate.Should().Be(delistingDate);
                stock.DividendRules.Values.Last().EffectivePeriod.ToDate.Should().Be(delistingDate);
                stock.RelativeNTAs.Values.Last().EffectivePeriod.ToDate.Should().Be(delistingDate);
            }
        }
        public void ListWithoutChildSecurities()
        {
            var listingDate = new Date(2000, 01, 01);

            var stock = new StapledSecurity(Guid.NewGuid());

            stock.List("ABC", "ABC Pty Ltd", listingDate, AssetCategory.AustralianProperty, new StapledSecurityChild[0]);

            using (new AssertionScope())
            {
                stock.Should().BeEquivalentTo(new
                {
                    Trust           = false,
                    EffectivePeriod = new DateRange(listingDate, Date.MaxValue)
                });

                stock.Properties[listingDate].Should().BeEquivalentTo(new
                {
                    AsxCode  = "ABC",
                    Name     = "ABC Pty Ltd",
                    Category = AssetCategory.AustralianProperty
                });

                // Check default values are set
                stock.DividendRules[listingDate].Should().BeEquivalentTo(new
                {
                    CompanyTaxRate       = 0.30m,
                    DividendRoundingRule = RoundingRule.Round,
                    DrpActive            = false,
                    DrpMethod            = DrpMethod.Round
                });

                stock.RelativeNTAs[listingDate].Percentages.Should().BeEmpty();

                stock.ChildSecurities.Should().BeEmpty();
            }
        }