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)); }
/// <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)); } }