private static void CheckGuess()
        {
            var sn     = new SecretNumber();
            var number = (int)GetFieldValue(sn, "_number");

            while (number >= 100 || number <= 1)
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            }
            if (sn.Guess != null)
            {
                ReportError("Egenskapen Guess är inte null trots att ingen gissning gjorts.");
            }
            sn.MakeGuess(number - 1);
            if (sn.Guess != number - 1)
            {
                ReportError("Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på ett för lågt tal gjorts.");
            }
            sn.MakeGuess(number + 1);
            if (sn.Guess != number + 1)
            {
                ReportError("Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på ett för högt tal gjorts.");
            }
            sn.MakeGuess(number);
            if (sn.Guess != number)
            {
                ReportError("Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på rätt tal gjorts.");
            }
        }
        private static void CheckMakeGuessHigh()
        {
            var sn = new SecretNumber();
            int number, prevNumber, loopCount = 5;

            do
            {
                prevNumber = (int)GetFieldValue(sn, "_number");
                Thread.Sleep(100);
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
                if (number < 1 || number > 100)
                {
                    ReportError("Initialize(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
                }
                if (prevNumber == number)
                {
                    if (--loopCount == 0)
                    {
                        ReportError("Initialize(): _number verkar inte slumpas");
                        return;
                    }
                }
            } while (number > 99);

            if (sn.MakeGuess(100) != Outcome.High)
            {
                ReportError("MakeGuess(): MakeGuess returnerar inte Outcome.High då det gissade talet är större än det hemliga talet.");
            }
            if (sn.Outcome != Outcome.High)
            {
                ReportError("Outcome: Egenskapen Outcome är inte Outcome.High efter en gissning på ett för stort tal gjorts.");
            }
        }
        public void CheckInitialize()
        {
            var sn = new SecretNumber();
            int number;
            do
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
                Assert.IsTrue(number >= 1 && number <= 100, "_number är inte ett tal i det slutna intervallet mellan 1 och 100.");
            } while (number >= 94);

            for (int i = 94; i <= 100; i++)
            {
                sn.MakeGuess(i);
            }
            sn.Initialize();

            Assert.IsTrue(sn.Count == 0, "Count initieras inte till 0.");
            Assert.IsNull(sn.Guess, "Guess initieras inte till null.");
            Assert.IsTrue(sn.Outcome == Outcome.Indefinite, "Outcome initieras inte till Outcome.Indefinite.");

            foreach (var gn in sn.GuessedNumbers)
            {
                Assert.IsTrue(gn.Number == null && gn.Outcome == Outcome.Indefinite, "GuessedNumbers verkar inte tömmas på gammal information.");
            }
        }
        private static void CheckInitialize()
        {
            var sn             = new SecretNumber();
            var guessedNumbers = GetFieldValue(sn, "_guessedNumbers") as GuessedNumber[];
            int number;

            do
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
                if (number < 1 || number > 100)
                {
                    ReportError("Initialize(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
                }
            } while (number >= 94);

            if (guessedNumbers != null && guessedNumbers != GetFieldValue(sn, "_guessedNumbers") as GuessedNumber[])
            {
                ReportError("Initialize(): _guessedNumber återanvänds inte utan tilldelas en referens till en helt ny array.");
            }

            if (sn.Count != 0)
            {
                ReportError("Initialize(): Count initieras inte till 0.");
            }
            if (!sn.CanMakeGuess)
            {
                ReportError("Initialize(): CanMakeGuess är false trots att det ska gå att gissa.");
            }
            else
            {
                for (int i = 94; i <= 100; i++)
                {
                    sn.MakeGuess(i);
                }
                sn.Initialize();

                if (sn.Count != 0)
                {
                    ReportError("Initialize(): Count initieras inte till 0.");
                }
                if (!sn.CanMakeGuess)
                {
                    ReportError("Initialize(): CanMakeGuess är false trots att det ska gå att gissa.");
                }

                guessedNumbers = (GuessedNumber[])GetFieldValue(sn, "_guessedNumbers");
                foreach (var gn in guessedNumbers)
                {
                    if (gn.Number != null && gn.Outcome != Outcome.Indefinite)
                    {
                        ReportError("Initialize(): _guessedNumbers töms inte på gamla gissningar.");
                        break;
                    }
                }
            }
        }
        private static void CheckGuessedNumberProperty()
        {
            var sn = new SecretNumber();
            var guessedNumbersField = (GuessedNumber[])GetFieldValue(sn, "_guessedNumbers");

            if (guessedNumbersField == sn.GuessedNumbers)
            {
                ReportError("Privacy leak!!! En kopia av den privata arrayen returneras inte av egenskapen GuessedNumbers.");
            }
        }
        private static void CheckMakeGuessRight()
        {
            var sn = new SecretNumber();

            if (sn.MakeGuess((int)GetFieldValue(sn, "_number")) != Outcome.Right)
            {
                ReportError("MakeGuess(): MakeGuess returnerar inte Outcome.Right då det gissade talet är lika med det hemliga talet.");
            }
            if (sn.Outcome != Outcome.Right)
            {
                ReportError("Outcome: Egenskapen Outcome är inte Outcome.Right efter en gissning på rätt tal gjorts.");
            }
        }
        private static void CheckMakeGuessArgumentOfRangeExcceptionIfGuessLowerThan1()
        {
            var sn = new SecretNumber();

            try
            {
                sn.MakeGuess(0);
                ReportError("MakeGuess(): ArgumentOutOfRangeException kastas inte vid gissning på ett tal mindre än 1.");
            }
            catch (ArgumentOutOfRangeException)
            {
                // Eat!
            }
        }
        private static void CheckMakeGuessArgumentOfRangeExcceptionIfGuessGreaterThan100()
        {
            var sn = new SecretNumber();

            try
            {
                sn.MakeGuess(101);
            }
            catch (ArgumentOutOfRangeException)
            {
                // Eat!
                return;
            }
            ReportError("MakeGuess(): ArgumentOutOfRangeException kastas inte vid gissning på ett tal större än 100.");
        }
        private static void CheckCount()
        {
            var sn     = new SecretNumber();
            var number = (int)GetFieldValue(sn, "_number");

            while (number >= 94)
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            }

            if (sn.Count != 0)
            {
                ReportError("Count: Count är inte 0 trots att ingen gissning gjorts.");
            }

            int count = 0;

            for (int i = 94; i <= 100; i++)
            {
                sn.MakeGuess(i);
                if (sn.Count != ++count)
                {
                    ReportError(String.Format("Count: Count är inte {0} trots att {0} gissning(ar) gjorts.", count));
                }
            }

            try
            {
                sn.MakeGuess(number);
            }
            catch
            {
                // Eat!
            }

            if (sn.Count != 7)
            {
                ReportError("Count: Count slutar inte att räknas upp efter att sju gissningar gjorts och ytterligare gissningar görs.");
            }
        }
 public void CheckMakeGuessHigh()
 {
     var sn = new SecretNumber();
     int number, prevNumber, loopCount = 5;
     do
     {
         prevNumber = (int)GetFieldValue(sn, "_number");
         Thread.Sleep(100);
         sn.Initialize();
         number = (int)GetFieldValue(sn, "_number");
         Assert.IsTrue(number >= 1 && number <= 100, "Initialize(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
         if (--loopCount == 0)
         {
             Assert.IsTrue(prevNumber != number, "Initialize(): _number verkar inte slumpas");
             return;
         }
     } while (number > 99);
     var result = sn.MakeGuess(100);
     Assert.IsTrue(result == Outcome.High, "MakeGuess returnerar inte Outcome.High då det gissade talet är högre än det hemliga talet.");
     Assert.IsTrue(sn.Outcome == Outcome.High, "Egenskapen Outcome är inte Outcome.High efter en gissning på ett för stort tal gjorts.");
 }
        private static void CheckConstructor()
        {
            var sn     = new SecretNumber();
            var number = (int)GetFieldValue(sn, "_number");

            if (number < 1 || number > 100)
            {
                ReportError("SecretNumber(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
            }

            var guessedNumbers = GetFieldValue(sn, "_guessedNumbers") as GuessedNumber[];

            if (guessedNumbers == null)
            {
                ReportError("SecretNumber(): _guessedNumbers har inte initierats.");
            }

            if (guessedNumbers != null && guessedNumbers.Length != 7)
            {
                ReportError("SecretNumber(): _guessedNumbers har inte sju element.");
            }
        }
        private static void CheckCanMakeGuess()
        {
            var sn = new SecretNumber();
            int number;

            do
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            } while (number >= 94);

            bool result = false;

            for (int i = 94; i <= 100; i++)
            {
                if (!(result = sn.CanMakeGuess))
                {
                    break;
                }
                sn.MakeGuess(i);
            }

            if (!result)
            {
                ReportError("CanMakeGuess: CanMakeGuess är false fast en gissning ska kunna göras.");
            }
            if (sn.CanMakeGuess)
            {
                ReportError("CanMakeGuess: CanMakeGuess är true fast en gissning inte ska kunna göras.");
            }

            sn.Initialize();
            sn.MakeGuess((int)GetFieldValue(sn, "_number"));
            if (sn.CanMakeGuess)
            {
                ReportError("CanMakeGuess: CanMakeGuess är true trots att rätt tal redan gissats.");
            }
        }
        private static void CheckMakeGuessNoMoreGuesses()
        {
            var sn     = new SecretNumber();
            var number = (int)GetFieldValue(sn, "_number");

            while (number >= 94)
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            }
            for (int i = 94; i <= 100; i++)
            {
                sn.MakeGuess(i);
            }
            if (sn.MakeGuess(number) != Outcome.NoMoreGuesses)
            {
                ReportError("MakeGuess returnerar inte Outcome.NoMoreGuesses då fler gissningar än sju görs.");
            }
            if (sn.Outcome != Outcome.NoMoreGuesses)
            {
                ReportError("Outcome: Egenskapen Outcome är inte Outcome.NoMoreGuesses då fler gissningar än sju gjorts.");
            }
        }
        public static void CheckNumberProperty()
        {
            var sn = new SecretNumber();

            if (sn.Number != null)
            {
                ReportError("Egenskapen Number returnerar inte null trots att det finns gissningar kvar.");
            }
            var number = (int)GetFieldValue(sn, "_number");

            while (number >= 94)
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            }
            for (int i = 94; i <= 100; i++)
            {
                sn.MakeGuess(i);
            }
            if (sn.Number != number)
            {
                ReportError("Egenskapen Number har inte samma värde som fältet _number trots att det inte finns några gissningar kvar.");
            }
        }
        private static void CheckMakeGuessOldGuess()
        {
            var sn = new SecretNumber();
            int number;

            do
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
                if (number < 1 || number > 100)
                {
                    ReportError("Initialize(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
                }
            } while (number > 99);
            sn.MakeGuess(100);
            if (sn.MakeGuess(100) != Outcome.OldGuess)
            {
                ReportError("MakeGuess returnerar inte Outcome.OldGuess då det gissade talet är samma som en tidigare gissning.");
            }
            if (sn.Outcome != Outcome.OldGuess)
            {
                ReportError("Outcome: Egenskapen Outcome är inte Outcome.OldGuess då det gissade talet är samma som en tidigare gissning.");
            }
        }
        static void Main(string[] args)
        {
            Console.Title = Strings.Title;

            // Testa grundläggande krav på klassen SecretNumber.
            Test.Run();

            // Deklarera och initiera lokala variabler.
            bool         continueGame = false;
            int          number       = 0;
            string       message      = null;
            SecretNumber secretNumber = new SecretNumber();

            // Upprepa spelomgångar tills användaren avslutar genom att
            // trycka ner tangenten 'N'.
            do
            {
                // Initiera ny spelomgång.
                secretNumber.Initialize();

                // Låt användaren gissa så länge det finns gissningar kvar.
                while (secretNumber.CanMakeGuess)
                {
                    // Rensa konsolfönstret och skriv ut eventuellt gjorda gissningar
                    // och meddelande.
                    Console.Clear();
                    Console.BackgroundColor = ConsoleColor.DarkRed;
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine(" ╔══════════════════════════════════════╗ ");
                    Console.WriteLine(" ║ Gissa det hemliga talet mellan 1-100 ║ ");
                    Console.WriteLine(" ╚══════════════════════════════════════╝ \n");
                    Console.ResetColor();
                    if (secretNumber.Count > 0)
                    {
                        Console.ForegroundColor = ConsoleColor.White;
                        GuessedNumber[] results = secretNumber.GuessedNumbers;
                        for (int i = 0; i < secretNumber.Count; i++)
                        {
                            Console.BackgroundColor = results[i].Outcome == Outcome.High ?
                                                      ConsoleColor.Red : ConsoleColor.Blue;
                            Console.Write(" {0} ", results[i].Number);
                        }
                        Console.ResetColor();
                        Console.WriteLine("\n");
                    }

                    if (!String.IsNullOrWhiteSpace(message))
                    {
                        Console.WriteLine(message);
                        Console.WriteLine();
                    }

                    // Läs in en gissning i det slutna intervallet mellan 1 och 100.
                    Console.ForegroundColor = ConsoleColor.White;
                    var prompt = String.Format(Strings.Guess_Number,
                                               Strings.ResourceManager.GetString(String.Format("Count_{0}", secretNumber.Count + 1)));
                    do
                    {
                        Console.Write(prompt);
                    } while (!(int.TryParse(Console.ReadLine(), out number) && number >= 1 && number <= 100));
                    Console.ResetColor();

                    try
                    {
                        // Gissa och skapa meddelande beroende på utfallet av gissningen.
                        if (secretNumber.MakeGuess(number) != Outcome.Right)
                        {
                            message = String.Format(Strings.ResourceManager.GetString(String.Format("Outcome_{0}",
                                                                                                    secretNumber.Outcome.ToString())), secretNumber.Guess);
                        }
                        else
                        {
                            message = String.Format(Strings.Outcome_Right,
                                                    Strings.ResourceManager.GetString(String.Format("Count_{0}", secretNumber.Count)).ToLower());
                        }

                        // Avsluta omgången om det inte går att gissa fler gånger och om senaste gissningen inte var rätt.
                        if (!secretNumber.CanMakeGuess && secretNumber.Outcome != Outcome.Right)
                        {
                            message += String.Format(Strings.Cannot_Guess, secretNumber.Number);
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Ett oväntat fel inträffade! Programmet avbryts.");
                        Console.WriteLine(ex.Message);
                        return;
                    }
                }
                Console.WriteLine();
                Console.WriteLine(message);

                Console.BackgroundColor = ConsoleColor.DarkRed;
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write("\n    Nytt hemligt nummer? [N] avbryter.    ");
                Console.CursorVisible = false;
                continueGame          = Console.ReadKey(true).Key != ConsoleKey.N;
                Console.CursorVisible = true;
                Console.ResetColor();
            } while (continueGame);
        }
 public void CheckGuessedNumberProperty()
 {
     var sn = new SecretNumber();
     var guessedNumbersField = (GuessedNumber[])GetFieldValue(sn, "_guessedNumbers");
     Assert.AreNotSame(guessedNumbersField, sn.GuessedNumbers, "Privacy leak!!! En kopia av den privata arrayen returneras inte av egenskapen GuessedNumbers.");
 }
 private static void CheckMakeGuessOldGuess()
 {
     var sn = new SecretNumber();
     int number;
     do
     {
         sn.Initialize();
         number = (int)GetFieldValue(sn, "_number");
         if (number < 1 || number > 100)
         {
             ReportError("Initialize(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
         }
     } while (number > 99);
     sn.MakeGuess(100);
     if (sn.MakeGuess(100) != Outcome.OldGuess)
     {
         ReportError("MakeGuess returnerar inte Outcome.OldGuess då det gissade talet är samma som en tidigare gissning.");
     }
     if (sn.Outcome != Outcome.OldGuess)
     {
         ReportError("Outcome: Egenskapen Outcome är inte Outcome.OldGuess då det gissade talet är samma som en tidigare gissning.");
     }
 }
        private static void CheckConstructor()
        {
            var sn = new SecretNumber();
            var number = (int)GetFieldValue(sn, "_number");
            if (number < 1 || number > 100)
            {
                ReportError("SecretNumber(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
            }

            var guessedNumbers = GetFieldValue(sn, "_guessedNumbers") as GuessedNumber[];
            if (guessedNumbers == null)
            {
                ReportError("SecretNumber(): _guessedNumbers har inte initierats.");
            }

            if (guessedNumbers != null && guessedNumbers.Length != 7)
            {
                ReportError("SecretNumber(): _guessedNumbers har inte sju element.");
            }
        }
 public void CheckMakeGuessArgumentOfRangeExcceptionIfGuessGreaterThan100()
 {
     var sn = new SecretNumber();
     try
     {
         sn.MakeGuess(101);
         throw new ApplicationException();
     }
     catch (ArgumentOutOfRangeException)
     {
         // Eat!
         return;
     }
     catch
     {
         Assert.Fail("ArgumentOutOfRangeException kastas inte vid gissning på ett tal större än 100.");
     }
 }
 public void CheckMakeGuesskNoMoreGuesses()
 {
     var sn = new SecretNumber();
     var number = (int)GetFieldValue(sn, "_number");
     while (number >= 94)
     {
         sn.Initialize();
         number = (int)GetFieldValue(sn, "_number");
     }
     for (int i = 94; i <= 100; i++)
     {
         sn.MakeGuess(i);
     }
     var result = sn.MakeGuess(number);
     Assert.IsTrue(result == Outcome.NoMoreGuesses, "MakeGuess returnerar inte Outcome.NoMoreGuesses då fler gissningar än sju görs.");
     Assert.IsTrue(sn.Outcome == Outcome.NoMoreGuesses, "Egenskapen Outcome är inte Outcome.NoMoreGuesses då fler gissningar än sju görs.");
 }
        private static void CheckGuess()
        {
            var sn = new SecretNumber();
            var number = (int)GetFieldValue(sn, "_number");
            while (number >= 100 || number <= 1)
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            }
            if (sn.Guess != null)
            {

                ReportError("Egenskapen Guess är inte null trots att ingen gissning gjorts.");
            }
            sn.MakeGuess(number - 1);
            if (sn.Guess != number - 1)
            {
                ReportError("Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på ett för lågt tal gjorts.");
            }
            sn.MakeGuess(number + 1);
            if (sn.Guess != number + 1)
            {
                ReportError("Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på ett för högt tal gjorts.");
            }
            sn.MakeGuess(number);
            if (sn.Guess != number)
            {
                ReportError("Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på rätt tal gjorts.");
            }
        }
 private static void CheckGuessedNumberProperty()
 {
     var sn = new SecretNumber();
     var guessedNumbersField = (GuessedNumber[])GetFieldValue(sn, "_guessedNumbers");
     if (guessedNumbersField == sn.GuessedNumbers)
     {
         ReportError("Privacy leak!!! En kopia av den privata arrayen returneras inte av egenskapen GuessedNumbers.");
     }
 }
 public void CheckMakeGuessOldGuess()
 {
     var sn = new SecretNumber();
     var guess = Math.Max((int)GetFieldValue(sn, "_number") ^ 3, 1);
     sn.MakeGuess(guess);
     Assert.IsTrue(sn.MakeGuess(guess) == Outcome.OldGuess, "MakeGuess returnerar inte Outcome.OldGuess då det gissade talet är samma som en tidigare gissning.");
     Assert.IsTrue(sn.Outcome == Outcome.OldGuess, "Egenskapen Outcome är inte Outcome.OldGuess då det gissade talet är samma som en tidigare gissning.");
 }
        private static void CheckCount()
        {
            var sn = new SecretNumber();
            var number = (int)GetFieldValue(sn, "_number");
            while (number >= 94)
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            }

            if (sn.Count != 0)
            {
                ReportError("Count: Count är inte 0 trots att ingen gissning gjorts.");
            }

            int count = 0;
            for (int i = 94; i <= 100; i++)
            {
                sn.MakeGuess(i);
                if (sn.Count != ++count)
                {
                    ReportError(String.Format("Count: Count är inte {0} trots att {0} gissning(ar) gjorts.", count));
                }
            }

            try
            {
                sn.MakeGuess(number);
            }
            catch
            {
                // Eat!
            }

            if (sn.Count != 7)
            {
                ReportError("Count: Count slutar inte att räknas upp efter att sju gissningar gjorts och ytterligare gissningar görs.");
            }
        }
        private static void CheckMakeGuessHigh()
        {
            var sn = new SecretNumber();
            int number, prevNumber, loopCount = 5;
            do
            {
                prevNumber = (int)GetFieldValue(sn, "_number");
                Thread.Sleep(100);
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
                if (number < 1 || number > 100)
                {
                    ReportError("Initialize(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
                }
                if (prevNumber == number)
                {
                    if (--loopCount == 0)
                    {
                        ReportError("Initialize(): _number verkar inte slumpas");
                        return;
                    }
                }
            } while (number > 99);

            if (sn.MakeGuess(100) != Outcome.High)
            {
                ReportError("MakeGuess(): MakeGuess returnerar inte Outcome.High då det gissade talet är större än det hemliga talet.");
            }
            if (sn.Outcome != Outcome.High)
            {
                ReportError("Outcome: Egenskapen Outcome är inte Outcome.High efter en gissning på ett för stort tal gjorts.");
            }
        }
 private static void CheckMakeGuessArgumentOfRangeExcceptionIfGuessLowerThan1()
 {
     var sn = new SecretNumber();
     try
     {
         sn.MakeGuess(0);
         ReportError("MakeGuess(): ArgumentOutOfRangeException kastas inte vid gissning på ett tal mindre än 1.");
     }
     catch (ArgumentOutOfRangeException)
     {
         // Eat!
     }
 }
 private static void CheckMakeGuessNoMoreGuesses()
 {
     var sn = new SecretNumber();
     var number = (int)GetFieldValue(sn, "_number");
     while (number >= 94)
     {
         sn.Initialize();
         number = (int)GetFieldValue(sn, "_number");
     }
     for (int i = 94; i <= 100; i++)
     {
         sn.MakeGuess(i);
     }
     if (sn.MakeGuess(number) != Outcome.NoMoreGuesses)
     {
         ReportError("MakeGuess returnerar inte Outcome.NoMoreGuesses då fler gissningar än sju görs.");
     }
     if (sn.Outcome != Outcome.NoMoreGuesses)
     {
         ReportError("Outcome: Egenskapen Outcome är inte Outcome.NoMoreGuesses då fler gissningar än sju gjorts.");
     }
 }
 public void CheckGuessProperty()
 {
     var sn = new SecretNumber();
     var number = (int)GetFieldValue(sn, "_number");
     while (number >= 94)
     {
         sn.Initialize();
         number = (int)GetFieldValue(sn, "_number");
     }
     Assert.IsNull(sn.Guess, "Egenskapen Guess är inte null trots att ingen gissning gjorts.");
     sn.MakeGuess(number - 1);
     Assert.IsTrue(sn.Guess == number - 1, "Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på ett för lågt tal gjorts.");
     sn.MakeGuess(number + 1);
     Assert.IsTrue(sn.Guess == number + 1, "Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på ett för högt tal gjorts.");
     sn.MakeGuess(number);
     Assert.IsTrue(sn.Guess == number, "Egenskapen Guess har inte värdet av den senaste gissningen då en gissning på rätt tal gjorts.");
 }
 public static void CheckNumberProperty()
 {
     var sn = new SecretNumber();
     if (sn.Number != null)
     {
         ReportError("Egenskapen Number returnerar inte null trots att det finns gissningar kvar.");
     }
     var number = (int)GetFieldValue(sn, "_number");
     while (number >= 94)
     {
         sn.Initialize();
         number = (int)GetFieldValue(sn, "_number");
     }
     for (int i = 94; i <= 100; i++)
     {
         sn.MakeGuess(i);
     }
     if (sn.Number != number)
     {
         ReportError("Egenskapen Number har inte samma värde som fältet _number trots att det inte finns några gissningar kvar.");
     }
 }
 public void CheckCountProperty()
 {
     var sn = new SecretNumber();
     var number = (int)GetFieldValue(sn, "_number");
     while (number >= 94)
     {
         sn.Initialize();
         number = (int)GetFieldValue(sn, "_number");
     }
     Assert.IsTrue(sn.Count == 0, "Egenskapen Count är inte 0 trots att ingen gissning gjorts.");
     int count = 0;
     for (int i = 94; i <= 100; i++)
     {
         sn.MakeGuess(i);
         Assert.IsTrue(sn.Count == ++count, String.Format("Egenskapen Count är inte {0} trots att {0} gissning(ar) gjorts.", count));
     }
     sn.MakeGuess(number);
     Assert.IsTrue(sn.Count == 7, "Egenskapen Count slutar inte att räknas upp efter att sju gissningar gjorts och ytterligare gissningar görs.");
 }
        static void Main(string[] args)
        {
            Console.Title = Strings.Title;

            // Testa grundläggande krav på klassen SecretNumber.
            Test.Run();

            // Deklarera och initiera lokala variabler. 
            bool continueGame = false;
            int number = 0;
            string message = null;
            SecretNumber secretNumber = new SecretNumber();

            // Upprepa spelomgångar tills användaren avslutar genom att 
            // trycka ner tangenten 'N'.
            do
            {
                // Initiera ny spelomgång.
                secretNumber.Initialize();

                // Låt användaren gissa så länge det finns gissningar kvar. 
                while (secretNumber.CanMakeGuess)
                {
                    // Rensa konsolfönstret och skriv ut eventuellt gjorda gissningar
                    // och meddelande.
                    Console.Clear();
                    Console.BackgroundColor = ConsoleColor.DarkRed;
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine(" ╔══════════════════════════════════════╗ ");
                    Console.WriteLine(" ║ Gissa det hemliga talet mellan 1-100 ║ ");
                    Console.WriteLine(" ╚══════════════════════════════════════╝ \n");
                    Console.ResetColor();
                    if (secretNumber.Count > 0)
                    {
                        Console.ForegroundColor = ConsoleColor.White;
                        GuessedNumber[] results = secretNumber.GuessedNumbers;
                        for (int i = 0; i < secretNumber.Count; i++)
                        {
                            Console.BackgroundColor = results[i].Outcome == Outcome.High ?
                                ConsoleColor.Red : ConsoleColor.Blue;
                            Console.Write(" {0} ", results[i].Number);
                        }
                        Console.ResetColor();
                        Console.WriteLine("\n");
                    }

                    if (!String.IsNullOrWhiteSpace(message))
                    {
                        Console.WriteLine(message);
                        Console.WriteLine();
                    }

                    // Läs in en gissning i det slutna intervallet mellan 1 och 100.
                    Console.ForegroundColor = ConsoleColor.White;
                    var prompt = String.Format(Strings.Guess_Number,
                        Strings.ResourceManager.GetString(String.Format("Count_{0}", secretNumber.Count + 1)));
                    do
                    {
                        Console.Write(prompt);
                    } while (!(int.TryParse(Console.ReadLine(), out number) && number >= 1 && number <= 100));
                    Console.ResetColor();

                    try
                    {
                        // Gissa och skapa meddelande beroende på utfallet av gissningen.
                        if (secretNumber.MakeGuess(number) != Outcome.Right)
                        {
                            message = String.Format(Strings.ResourceManager.GetString(String.Format("Outcome_{0}",
                                secretNumber.Outcome.ToString())), secretNumber.Guess);
                        }
                        else
                        {
                            message = String.Format(Strings.Outcome_Right,
                                Strings.ResourceManager.GetString(String.Format("Count_{0}", secretNumber.Count)).ToLower());
                        }

                        // Avsluta omgången om det inte går att gissa fler gånger och om senaste gissningen inte var rätt.
                        if (!secretNumber.CanMakeGuess && secretNumber.Outcome != Outcome.Right)
                        {
                            message += String.Format(Strings.Cannot_Guess, secretNumber.Number);
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Ett oväntat fel inträffade! Programmet avbryts.");
                        Console.WriteLine(ex.Message);
                        return;
                    }
                }
                Console.WriteLine();
                Console.WriteLine(message);

                Console.BackgroundColor = ConsoleColor.DarkRed;
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write("\n    Nytt hemligt nummer? [N] avbryter.    ");
                Console.CursorVisible = false;
                continueGame = Console.ReadKey(true).Key != ConsoleKey.N;
                Console.CursorVisible = true;
                Console.ResetColor();
            } while (continueGame);
        }
        public void CheckCanMakeGuessProperty()
        {
            var sn = new SecretNumber();
            var number = (int)GetFieldValue(sn, "_number");
            while (number >= 94)
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            }
            for (int i = 94; i <= 100; i++)
            {
                Assert.IsTrue(sn.CanMakeGuess, "Egenskapen CanMakeGuess är inte true trots att alla gissningar inte gjorts.");
                sn.MakeGuess(i);
            }
            Assert.IsFalse(sn.CanMakeGuess, "Egenskapen CanMakeGuess är inte false trots att sju gissningar gjorts.");

            sn.Initialize();
            sn.MakeGuess((int)GetFieldValue(sn, "_number"));
            Assert.IsFalse(sn.CanMakeGuess, "Egenskapen CanMakeGuess är inte false trots att en gissning på rätt tal gjorts.");
        }
        private static void CheckInitialize()
        {
            var sn = new SecretNumber();
            var guessedNumbers = GetFieldValue(sn, "_guessedNumbers") as GuessedNumber[];
            int number;
            do
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
                if (number < 1 || number > 100)
                {
                    ReportError("Initialize(): _number är inte ett tal i det slutna intervallet mellan 1 och 100.");
                }
            } while (number >= 94);

            if (guessedNumbers != null && guessedNumbers != GetFieldValue(sn, "_guessedNumbers") as GuessedNumber[])
            {
                ReportError("Initialize(): _guessedNumber återanvänds inte utan tilldelas en referens till en helt ny array.");
            }

            if (sn.Count != 0)
            {
                ReportError("Initialize(): Count initieras inte till 0.");
            }
            if (!sn.CanMakeGuess)
            {
                ReportError("Initialize(): CanMakeGuess är false trots att det ska gå att gissa.");
            }
            else
            {
                for (int i = 94; i <= 100; i++)
                {
                    sn.MakeGuess(i);
                }
                sn.Initialize();

                if (sn.Count != 0)
                {
                    ReportError("Initialize(): Count initieras inte till 0.");
                }
                if (!sn.CanMakeGuess)
                {
                    ReportError("Initialize(): CanMakeGuess är false trots att det ska gå att gissa.");
                }

                guessedNumbers = (GuessedNumber[])GetFieldValue(sn, "_guessedNumbers");
                foreach (var gn in guessedNumbers)
                {
                    if (gn.Number != null && gn.Outcome != Outcome.Indefinite)
                    {
                        ReportError("Initialize(): _guessedNumbers töms inte på gamla gissningar.");
                        break;
                    }
                }
            }
        }
 private static void CheckMakeGuessArgumentOfRangeExcceptionIfGuessGreaterThan100()
 {
     var sn = new SecretNumber();
     try
     {
         sn.MakeGuess(101);
     }
     catch (ArgumentOutOfRangeException)
     {
         // Eat!
         return;
     }
     ReportError("MakeGuess(): ArgumentOutOfRangeException kastas inte vid gissning på ett tal större än 100.");
 }
 private static void CheckMakeGuessRight()
 {
     var sn = new SecretNumber();
     if (sn.MakeGuess((int)GetFieldValue(sn, "_number")) != Outcome.Right)
     {
         ReportError("MakeGuess(): MakeGuess returnerar inte Outcome.Right då det gissade talet är lika med det hemliga talet.");
     }
     if (sn.Outcome != Outcome.Right)
     {
         ReportError("Outcome: Egenskapen Outcome är inte Outcome.Right efter en gissning på rätt tal gjorts.");
     }
 }
        private static void CheckCanMakeGuess()
        {
            var sn = new SecretNumber();
            int number;
            do
            {
                sn.Initialize();
                number = (int)GetFieldValue(sn, "_number");
            } while (number >= 94);

            bool result = false;
            for (int i = 94; i <= 100; i++)
            {
                if (!(result = sn.CanMakeGuess))
                {
                    break;
                }
                sn.MakeGuess(i);
            }

            if (!result)
            {
                ReportError("CanMakeGuess: CanMakeGuess är false fast en gissning ska kunna göras.");
            }
            if (sn.CanMakeGuess)
            {
                ReportError("CanMakeGuess: CanMakeGuess är true fast en gissning inte ska kunna göras.");
            }

            sn.Initialize();
            sn.MakeGuess((int)GetFieldValue(sn, "_number"));
            if (sn.CanMakeGuess)
            {
                ReportError("CanMakeGuess: CanMakeGuess är true trots att rätt tal redan gissats.");
            }
        }
 public void CheckMakeGuessRight()
 {
     var sn = new SecretNumber();
     Assert.IsTrue(sn.MakeGuess((int)GetFieldValue(sn, "_number")) == Outcome.Right, "MakeGuess returnerar inte Outcome.Right då det gissade talet är samma som det hemliga talet.");
     Assert.IsTrue(sn.Outcome == Outcome.Right, "Egenskapen Outcome är inte Outcome.Right efter en gissning på rätt tal gjorts.");
 }