public void CreateFromBinaryInputZeroTest()
        {
            string  input = "0";
            Operand op    = OperandUtils.CreateFromBinaryInput(input, false);

            Assert.AreEqual(Convert.ToInt32(input, 2), op.decimalValue);
        }
        public void CreateFromBinaryInputNegativeTest()
        {
            string input = "10101010";

            Operand op = OperandUtils.CreateFromBinaryInput(input, true);

            Assert.AreEqual(-Convert.ToInt32(input, 2), op.decimalValue);
        }
        public void CreateFromBinaryInputEmptyStringThrowsTest()
        {
            string input = "";

            Assert.ThrowsException <ArgumentException>(() => OperandUtils.CreateFromBinaryInput(input, false));
        }
        public void CreateFromBinaryInputIllegalCharactersThrowsTest()
        {
            string input = "A0101";

            Assert.ThrowsException <ArgumentException>(() => OperandUtils.CreateFromBinaryInput(input, false));
        }
예제 #5
0
        /// <summary>
        /// Diese Funktion erstellt aus einem InputToken einen Operanden
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static Operand CreateOperandFromInputToken(InputToken token)
        {
            string input = token.Token;

            bool isNegative = false;

            //wenn das erste zeichen im token ein minus ist, haben wir eine negative zahl
            if (input[0] == '-')
            {
                isNegative = true;
                //merke dir dass die zahl negativ ist, entferne das minuszeichen, das braucht man nicht fürs konvertieren
                input = input.Remove(0, 1);
            }

            // teile den input string am _ , dies ist der separator der präfix und wert trennt
            // b_10101 -> b, 10101
            string[] splittedToken = input.Split('_');
            // haben wir nun ein array mit mehr als 3 teilen
            // hat der user irgendwas falsches eingegeben: zb. h_b_h_12
            // dies würde durch die split methode zu h , b , h, 12 und somit ungültig
            if (splittedToken.Length > 2)
            {
                throw new ArgumentException("Operand " + input + " ist ungültig.");
            }
            //eine länge von 2 bedeutet, dass unser token einen präfix und wert enthält
            else if (splittedToken.Length == 2)
            {
                //nach anforderung ist der erste part im string ist das prefix zweiter part ist der wert
                string prefix = splittedToken[0];
                string value  = splittedToken[1];

                //wenn der präfix aus mehr als einem zeichen besteht, ist dieser fehlerhaft
                if (prefix.Length > 1)
                {
                    throw new ArgumentException("Präfix <" + prefix + "> ist zu lang.");
                }
                else
                {
                    //entscheide anhand des präfixes, welche konvertierungsfunktion verwendet werden soll
                    //und gib nach dem konvertieren einen operanden zurück
                    switch (prefix)
                    {
                    case "b":
                        return(OperandUtils.CreateFromBinaryInput(value, isNegative));

                    case "o":
                        return(OperandUtils.CreateFromOctalInput(value, isNegative));

                    case "d":
                        return(OperandUtils.CreateFromDecimalInput(value, isNegative));

                    case "h":
                        return(OperandUtils.CreateFromHexadecimalInput(value, isNegative));

                    default:
                        // sonstige Präfixe werden nicht unterstützt
                        throw new ArgumentException("Präfix <" + prefix + ">ist ungültig.");
                    }
                }
            }
            else // bei einer länge von 1 gehen wir davon aus, dass der input eine Dezimalzahl ist
            {
                // Achtung! Länge von 0 wäre hier auch möglich, gibt aber natürlich einen fehler
                // Eine solche fehlerhafte eingabe wird in der unteren funktion beachtet
                return(OperandUtils.CreateFromDecimalInput(splittedToken[0], isNegative));
            }
        }