// Precondition:  None
        // Postcondition: Parcels have been created and displayed
        static void Main(string[] args)
        {
            // Test Data - Magic Numbers OK
            Address a1 = new Address("John Smith", "123 Any St.", "Apt. 45",
                                     "Louisville", "KY", 40202);                    // Test Address 1
            Address a2 = new Address("Jane Doe", "987 Main St.", "",
                                     "Beverly Hills", "CA", 90210);                 // Test Address 2
            Address a3 = new Address("James Kirk", "654 Roddenberry Way", "Suite 321",
                                     "El Paso", "TX", 79901);                       // Test Address 3
            Address a4 = new Address("John Crichton", "678 Pau Place", "Apt. 7",
                                     "Portland", "ME", 04101);                      // Test Address 4

            Letter            letter1 = new Letter(a1, a2, 3.95M);                  // Letter test object
            GroundPackage     gp1     = new GroundPackage(a3, a4, 14, 10, 5, 12.5); // Ground test object
            NextDayAirPackage ndap1   = new NextDayAirPackage(a1, a3, 25, 15, 15,   // Next Day test object
                                                              85, 7.50M);
            TwoDayAirPackage tdap1 = new TwoDayAirPackage(a4, a1, 46.5, 39.5, 28.0, // Two Day test object
                                                          80.5, TwoDayAirPackage.Delivery.Saver);
            Letter            letter2 = new Letter(a3, a2, 6.99M);                  // Letter test object
            GroundPackage     gp2     = new GroundPackage(a4, a3, 11, 8, 3, 9.5);   // Ground test object
            NextDayAirPackage ndap2   = new NextDayAirPackage(a2, a3, 35, 25, 20,   // Next Day test object
                                                              95, 9.50M);
            TwoDayAirPackage tdap2 = new TwoDayAirPackage(a3, a1, 26.5, 19.5, 18.0, // Two Day test object
                                                          40, TwoDayAirPackage.Delivery.Early);
            Letter            letter3 = new Letter(a2, a3, 5.95M);                  // Letter test object
            GroundPackage     gp3     = new GroundPackage(a3, a4, 5, 10, 2, 4);     // Ground test object
            NextDayAirPackage ndap3   = new NextDayAirPackage(a3, a1, 20, 14, 12,   // Next Day test object
                                                              15, 5M);
            TwoDayAirPackage tdap3 = new TwoDayAirPackage(a2, a1, 12, 8, 3.5,       // Two Day test object
                                                          80.5, TwoDayAirPackage.Delivery.Saver);

            List <Parcel> parcels;      // List of test parcels

            parcels = new List <Parcel>();

            parcels.Add(letter1); // Populate list
            parcels.Add(gp1);
            parcels.Add(ndap1);
            parcels.Add(tdap1);
            parcels.Add(letter2);
            parcels.Add(gp2);
            parcels.Add(ndap2);
            parcels.Add(letter3);
            parcels.Add(gp3);
            parcels.Add(ndap3);
            parcels.Add(tdap3);
            parcels.Add(tdap3);

            // Lists parcel in original list
            Console.WriteLine("Original List:");
            Console.WriteLine("====================");
            foreach (Parcel p in parcels)
            {
                Console.WriteLine(p);
                Console.WriteLine("====================");
            }
            Pause();

            // Lists parcel in order by cost
            parcels.Sort();
            Console.Out.WriteLine("Sorted list (natural order):");
            foreach (Parcel p in parcels)
            {
                Console.WriteLine(p.CalcCost().ToString("C"));
            }
            Pause();

            // Lists parcels in descending order by Destination Zip Code
            parcels.Sort(new ParcelDescOrderByDestZip());

            Console.Out.WriteLine("Sorted list (descending order) using Comparer:");
            foreach (Parcel p in parcels)
            {
                Console.WriteLine(p.DestinationAddress.Zip.ToString("D5"));
            }
            Pause();

            // Lists parcel in ascending order by Type and descending by cost
            parcels.Sort(new ParcelAscTypeDescCost());

            Console.Out.WriteLine("Sorted list (type ascending order then\r\ncost descending order) using Comparer:");
            foreach (Parcel p in parcels)
            {
                Console.Write($"{p.GetType(),-20} {p.CalcCost().ToString("C"), 10}");
                Console.WriteLine();
            }
        }