protected static void EvaluateRoll(string diceExpr, RollerConfig conf, RollData data, int expectedRolls, string expectedResult) { var result = Roller.Roll(diceExpr, conf, data); Assert.AreEqual(expectedRolls, result.NumRolls); Assert.AreEqual(expectedResult, result.ToString()); }
public void ThrowBadSides_WhenExceedingMaxSides() { var conf = new RollerConfig() { MaxSides = 100, GetRandomBytes = GetRNG(0, 2) }; EvaluateRoll("1d1000", conf, DiceErrorCode.BadSides); }
public void Successfully_RollVariableDice_Normal() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(2, 4, 4, 4) }; EvaluateRoll("(1d8)d6", conf, 4, "3d6 => 5 + 5 + 5 => 15"); }
public void ThrowInvalidOperationException_WhenTooFewMaxSides() { var conf = new RollerConfig() { MaxSides = 0 }; Roller.Roll("1d20", conf); }
public void Successfully_Max_Successes() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(9, 4, 5, 5) }; EvaluateRoll("max(2d10>5, 2d10>5)", conf, 4, "max(2d10.success(>5), 2d10.success(>5)) => max(10* + 5*, $6 + $6) => 2 successes"); }
public void Successfully_Max_BiggerRight() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(4, 9) }; EvaluateRoll("max(1d20, 1d20)", conf, 2, "max(1d20, 1d20) => max(5*, 10) => 10"); }
public void Successfully_Min_Successes() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(0, 7, 5, 5) }; EvaluateRoll("min(2d10>5f1, 2d10>5f1)", conf, 4, "min(2d10.success(>5).failure(=1), 2d10.success(>5).failure(=1)) => min(#1 + $8, 6* + 6*) => 0 successes"); }
public void Successfully_TerminateTooManyRerolls() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(Roll9()), MaxRerolls = 2 }; EvaluateRoll("1d20rr!=2", conf, 3, "1d20.reroll(!=2) => 9* + 9* + 9 => 9"); }
public void Successfully_Max_BiggerLeft() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(9, 4) }; EvaluateRoll("max(1d20, 1d20)", conf, 2, "max(1d20, 1d20) => max(10, 5*) => 10"); }
public void Successfully_Min_BiggerRight() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(4, 9) }; EvaluateRoll("min(1d20, 1d20)", conf, 2, "min(1d20, 1d20) => min(5, 10*) => 5"); }
public void ThrowInvalidOperationException_WhenTooLowMaxRerolls() { var conf = new RollerConfig() { MaxRerolls = -1 }; Roller.Roll("1d20", conf); }
public void ThrowRecursionDepthExceeded_WhenExceedingRecursion() { var conf = new RollerConfig() { MaxRecursionDepth = 0, GetRandomBytes = GetRNG(0, 2) }; EvaluateRoll("1d20rr1", conf, DiceErrorCode.RecursionDepthExceeded); }
public void Successfully_Min_BiggerLeft() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(9, 4) }; EvaluateRoll("min(1d20, 1d20)", conf, 2, "min(1d20, 1d20) => min(10*, 5) => 5"); }
public void ThrowTooManyDice_WhenTooManyDice() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(Roll9()), MaxDice = 2 }; EvaluateRoll("1d20rr<>2", conf, DiceErrorCode.TooManyDice); }
public void Successfully_HandleNestedRerolls() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(0, 0, 1, 1, 0, 2, 3) }; EvaluateRoll("{2d20rr1}rr<5", conf, 7, "{2d20.reroll(=1)}.reroll(<5) => (4* + 7) => 7"); }
public void Successfully_MinMax_BiggerLeft() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(17) }; EvaluateRoll("min(max(1d20, 10), 9)", conf, 1, "min(max(1d20, 10), 9) => min(max(18*, 10*), 9) => 9"); }
public void Successfully_PerformVariableComparison_Normal() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(0, 0, 1) }; EvaluateRoll("1d10rr(1d10)", conf, 3, "1d10.reroll(=1) => 1!* + 2 => 2"); }
public void Successfully_RegisterMacro() { var registry = new MacroRegistry(); registry.RegisterMacro("c", MacroContainer.A); var conf = new RollerConfig() { MacroRegistry = registry, GetRandomBytes = GetRNG(Roll9()) }; EvaluateRoll("[c]d20", conf, 1, "1d20 => 9 => 9"); }
public void Successfully_EvaluateTwice() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(2, 3, 4, 5, 6, 7) }; var node = new GroupNode(Two, new List <DiceAST> { _2d20 }); EvaluateNode(node, Data(conf), 4, "2{2d20} => (7) + (11) => 18"); }
public void Successfully_RegisterStaticFunctions() { var registry = new FunctionRegistry(); registry.RegisterType(typeof(FunctionContainer)); var conf = new RollerConfig() { FunctionRegistry = registry, GetRandomBytes = GetRNG(Roll9()) }; EvaluateRoll("1d20.a()", conf, 1, "1d20.a() => 9 => 10"); }
public void Successfully_RegisterStaticMacros() { var registry = new MacroRegistry(); registry.RegisterType(typeof(MacroContainer)); var conf = new RollerConfig() { MacroRegistry = registry, GetRandomBytes = GetRNG(Roll9()) }; EvaluateRoll("1d20+[a]", conf, 1, "1d20 + [a] => 9 + 1 => 10"); }
public void Successfully_RegisterFunction() { var registry = new FunctionRegistry(); registry.RegisterFunction("c", FunctionContainer.A, FunctionScope.Basic); var conf = new RollerConfig() { FunctionRegistry = registry, GetRandomBytes = GetRNG(Roll9()) }; EvaluateRoll("1d20.c()", conf, 1, "1d20.c() => 9 => 10"); }
public void ThrowTooManyDice_WhenRerollingMoreThanMaxDice() { var conf = new RollerConfig() { MaxDice = 10, GetRandomBytes = GetRNG(Roll1()) }; var node = new RerollNode(0, equal1) { Expression = _1d20 }; EvaluateNode(node, Data(conf), DiceErrorCode.TooManyDice); }
public void Successfully_AbortRerollWhenMaxRerollsReached() { var conf = new RollerConfig() { MaxRerolls = 2, GetRandomBytes = GetRNG(Roll1()) }; var node = new RerollNode(0, equal1) { Expression = _1d20 }; EvaluateNode(node, Data(conf), 3, "1d20.reroll(=1) => 1!* + 1!* + 1! => 1"); }
public void Successfully_DontRerollNestedRolls() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(2, 2, 2, 2, 3, 3, 3, 3, 3) }; var roll = new RollNode(RollType.Normal, _1d8, Six); var node = new GroupNode(Two, new List <DiceAST> { roll }); EvaluateNode(node, Data(conf), 7, "2{3d6} => (9) + (12) => 21"); }
public void Successfully_RegisterGlobalMacro_Config() { var registry = new MacroRegistry(); registry.RegisterType(new MacroContainer(3)); registry.RegisterGlobalMacro(MacroContainer.A); var config = new RollerConfig() { MacroRegistry = registry }; EvaluateRoll("[b]", config, 0, "[b] => 3 => 3"); EvaluateRoll("[bb]", config, 0, "[bb] => 1 => 1"); }
public void Successfully_EvaluateTwice_Expand() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(2, 3, 4, 5, 6, 7) }; var data = Data(conf); var group = new GroupNode(Two, new List <DiceAST> { _2d20 }); var node = new FunctionNode(FunctionScope.Group, "expand", new DiceAST[0], data); node.Context.Expression = group; EvaluateNode(node, data, 4, "2{2d20}.expand() => (3 + 4) + (5 + 6) => 18"); }
protected static void EvaluateRoll(string diceExpr, RollerConfig conf, DiceErrorCode error) { try { Roller.Roll(diceExpr, conf); Assert.Fail("Expected DiceException with error code {0}, but did not receive an exception.", error.ToString()); } catch (DiceException e) { if (e.ErrorCode != error) { Assert.Fail("Expected DiceException with error code {0}, but got error code {1}.", error.ToString(), e.ErrorCode.ToString()); } } }
public void Successfully_ListAllValuesForMultipleExprs_Expand() { var conf = new RollerConfig() { GetRandomBytes = GetRNG(2, 3, 4, 5, 6, 7, 8) }; var data = Data(conf); var group = new GroupNode(null, new List <DiceAST> { _1d20, _2d20, _4d20 }); var node = new FunctionNode(FunctionScope.Group, "expand", new DiceAST[0], data); node.Context.Expression = group; EvaluateNode(node, data, 7, "{1d20, 2d20, 4d20}.expand() => ((3) + (4 + 5) + (6 + 7 + 8 + 9)) => 42"); }
public void ThrowTooManyDice_Min_Reroll1s() { try { var conf = new RollerConfig() { MaxDice = 20, MaxRerolls = 100 }; var res = Roller.Min("4d6rr1", conf); Assert.Fail("Expected an exception and none was thrown"); } catch (DiceException e) { Assert.AreEqual(DiceErrorCode.TooManyDice, e.ErrorCode); } }