private static SelfCheckout EnterItem(SelfCheckout selfCheckout, int index)
        {
            var price    = Input.Parse(message: string.Format("Price of item {0}: ", index));
            var quantity = Input.Parse(message: string.Format("Quantity of item {0}: ", index));

            return(selfCheckout.Scan(price, quantity));
        }
        private static SelfCheckout EnterItem(SelfCheckout selfCheckout, int index)
        {
            var price = Input.Parse(message: string.Format("Price of item {0}: ", index));
            var quantity = Input.Parse(message: string.Format("Quantity of item {0}: ", index));

            return selfCheckout.Scan(price, quantity);
        }
        public void Tax_Of_No_Items_Scanned_Is_Zero()
        {
            var subject = new SelfCheckout();

            decimal tax = subject.Tax();

            Assert.That(tax, Is.EqualTo(0m));
        }
        public void Total_Of_No_Items_Scanned_Is_Zero()
        {
            var subject = new SelfCheckout();

            decimal total = subject.Total();

            Assert.That(total, Is.EqualTo(0m));
        }
        public void Total_Of_No_Items_Scanned_Is_Zero()
        {
            var subject = new SelfCheckout();

            decimal total = subject.Total();

            Assert.That(total, Is.EqualTo(0m));
        }
        public void Tax_Of_No_Items_Scanned_Is_Zero()
        {
            var subject = new SelfCheckout();

            decimal tax = subject.Tax();

            Assert.That(tax, Is.EqualTo(0m));
        }
        public FormattedSelfCheckout(SelfCheckout selfCheckout)
        {
            if (selfCheckout == null)
            {
                throw new ArgumentNullException("selfCheckout");
            }

            this.selfCheckout = selfCheckout;
        }
        public void Total_Of_One_Item_Scanned()
        {
            var subject = new SelfCheckout();

            decimal total = subject
                .Scan(price: 25, quantity: 1)
                .Total();

            Assert.That(total, Is.EqualTo(26.375m));
        }
        public void Tax_Of_One_Item_Scanned_With_Multiple_Quantities()
        {
            var subject = new SelfCheckout();

            decimal total = subject
                            .Scan(price: 25, quantity: 2)
                            .Tax();

            Assert.That(total, Is.EqualTo(2.75m));
        }
        public void Tax_Of_One_Item_Scanned()
        {
            var subject = new SelfCheckout();

            decimal tax = subject
                          .Scan(price: 25, quantity: 1)
                          .Tax();

            Assert.That(tax, Is.EqualTo(1.375m));
        }
        public void Total_Of_One_Item_Scanned()
        {
            var subject = new SelfCheckout();

            decimal total = subject
                            .Scan(price: 25, quantity: 1)
                            .Total();

            Assert.That(total, Is.EqualTo(26.375m));
        }
        public void SubTotal_Of_Multiple_Items_Scanned_With_Multiple_Quantities()
        {
            var subject = new SelfCheckout();

            decimal total = subject
                            .Scan(price: 25, quantity: 2)
                            .Scan(price: 10, quantity: 1)
                            .SubTotal();

            Assert.That(total, Is.EqualTo(60m));
        }
        public void Scanning_Multiple_Items()
        {
            var subject = new SelfCheckout();

            subject = subject
                      .Scan(price: 25, quantity: 2)
                      .Scan(price: 10, quantity: 1)
                      .Scan(price: 4, quantity: 1);

            Assert.That(subject.SubTotal(), Is.EqualTo(64.00m));
            Assert.That(subject.Tax(), Is.EqualTo(3.52m));
            Assert.That(subject.Total(), Is.EqualTo(67.52m));
        }
        public void Execute()
        {
            var selfCheckout = new SelfCheckout();

            foreach (var index in Enumerable.Range(1, 3))
            {
                selfCheckout = EnterItem(selfCheckout, index);
            }

            var formattedSelfCheckout = new FormattedSelfCheckout(selfCheckout);

            Console.WriteLine("Subtotal: {0}", formattedSelfCheckout.SubTotal());
            Console.WriteLine("Tax: {0}", formattedSelfCheckout.Tax());
            Console.WriteLine("Total: {0}", formattedSelfCheckout.Total());
        }
        public void Execute()
        {
            var selfCheckout = new SelfCheckout();

            foreach (var index in Enumerable.Range(1, 3))
            {
                selfCheckout = EnterItem(selfCheckout, index);
            }

            var formattedSelfCheckout = new FormattedSelfCheckout(selfCheckout);

            Console.WriteLine("Subtotal: {0}", formattedSelfCheckout.SubTotal());
            Console.WriteLine("Tax: {0}", formattedSelfCheckout.Tax());
            Console.WriteLine("Total: {0}", formattedSelfCheckout.Total());
        }
        public void Tax_Of_One_Item_Scanned()
        {
            var subject = new SelfCheckout();

            decimal tax = subject
                .Scan(price: 25, quantity: 1)
                .Tax();

            Assert.That(tax, Is.EqualTo(1.375m));
        }
        public void Tax_Of_One_Item_Scanned_With_Multiple_Quantities()
        {
            var subject = new SelfCheckout();

            decimal total = subject
                .Scan(price: 25, quantity: 2)
                .Tax();

            Assert.That(total, Is.EqualTo(2.75m));
        }
        public void Scanning_Multiple_Items()
        {
            var subject = new SelfCheckout();

            subject = subject
                .Scan(price: 25, quantity: 2)
                .Scan(price: 10, quantity: 1)
                .Scan(price: 4, quantity: 1);

            Assert.That(subject.SubTotal(), Is.EqualTo(64.00m));
            Assert.That(subject.Tax(), Is.EqualTo(3.52m));
            Assert.That(subject.Total(), Is.EqualTo(67.52m));
        }
        public void SubTotal_Of_Multiple_Items_Scanned_With_Multiple_Quantities()
        {
            var subject = new SelfCheckout();

            decimal total = subject
                .Scan(price: 25, quantity: 2)
                .Scan(price: 10, quantity: 1)
                .SubTotal();

            Assert.That(total, Is.EqualTo(60m));
        }
        public FormattedSelfCheckout(SelfCheckout selfCheckout)
        {
            if (selfCheckout == null)
            {
                throw new ArgumentNullException("selfCheckout");
            }

            this.selfCheckout = selfCheckout;
        }