public static void BitStackPushPop(int bitLength) { BitStack bitStack = default; Assert.Equal(0, bitStack.CurrentDepth); var values = new bool[bitLength]; for (int i = 0; i < bitLength; i++) { values[i] = s_random.NextDouble() >= 0.5; } for (int i = 0; i < bitLength; i++) { if (values[i]) { bitStack.PushTrue(); } else { bitStack.PushFalse(); } Assert.Equal(i + 1, bitStack.CurrentDepth); } // Loop backwards when popping. for (int i = bitLength - 1; i > 0; i--) { // We need the value at the top *after* popping off the last one. Assert.Equal(values[i - 1], bitStack.Pop()); Assert.Equal(i, bitStack.CurrentDepth); } }
[InlineData(int.MaxValue / 32 + 1)] // 67_108_864 public static void BitStackPushPopLarge(int bitLength) { BitStack bitStack = default; Assert.Equal(0, bitStack.CurrentDepth); var values = new bool[bitLength]; for (int i = 0; i < bitLength; i++) { values[i] = s_random.NextDouble() >= 0.5; } const int IterationCapacity = 1_600_000; int expectedDepth = 0; // Only set and compare the first and last few (otherwise, the test takes too long) for (int i = 0; i < IterationCapacity; i++) { if (values[i]) { bitStack.PushTrue(); } else { bitStack.PushFalse(); } expectedDepth++; Assert.Equal(expectedDepth, bitStack.CurrentDepth); } for (int i = bitLength - IterationCapacity; i < bitLength; i++) { if (values[i]) { bitStack.PushTrue(); } else { bitStack.PushFalse(); } expectedDepth++; Assert.Equal(expectedDepth, bitStack.CurrentDepth); } Assert.Equal(expectedDepth, IterationCapacity * 2); // Loop backwards when popping. for (int i = bitLength - 1; i >= bitLength - IterationCapacity; i--) { // We need the value at the top *after* popping off the last one. Assert.Equal(values[i - 1], bitStack.Pop()); expectedDepth--; Assert.Equal(expectedDepth, bitStack.CurrentDepth); } for (int i = IterationCapacity - 1; i > 0; i--) { // We need the value at the top *after* popping off the last one. Assert.Equal(values[i - 1], bitStack.Pop()); expectedDepth--; Assert.Equal(expectedDepth, bitStack.CurrentDepth); } }