Skip to content

Instantly share code, notes, and snippets.

@Gelio
Last active April 5, 2017 07:58
Show Gist options
  • Save Gelio/e70d9df627c20ec5616976804a6ddc37 to your computer and use it in GitHub Desktop.
Save Gelio/e70d9df627c20ec5616976804a6ddc37 to your computer and use it in GitHub Desktop.
ASD2 laboratory task 7 main file with custom tests and performance metrics
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ASD
{
class BridgeCrossingTestCase : TestCase
{
private int[] times;
private int expectedResult;
private int result;
private List<List<int>> strategy;
public BridgeCrossingTestCase(double timeLimit, int[] t, int expRes) : base(timeLimit, null)
{
this.times = t;
this.expectedResult = expRes;
}
public override void PerformTestCase()
{
result = BridgeCrossing.CrossBridge(times, out strategy);
}
public override void VerifyTestCase(out Result resultCode, out string message)
{
if (result != expectedResult)
{
resultCode = Result.BadResult;
message = string.Format("incorrect result: {0} (expected: {1})", result, expectedResult);
return;
}
if (strategy == null || strategy.Count == 0)
{
resultCode = Result.BadResult;
message = "empty strategy";
return;
}
int strategyResult = 0;
List<int> leftRiverside = Enumerable.Range(0, times.Length).ToList();
List<int> rightRiverside = new List<int>();
bool fromLeftToRight = true;
foreach (List<int> crossing in strategy)
{
if (crossing == null || crossing.Count == 0)
{
resultCode = Result.BadResult;
message = "empty list in strategy, returned strategy: " + StrategyToString(strategy);
return;
}
if (crossing.Count > 2)
{
resultCode = Result.BadResult;
message = "too many people in one crossing, returned strategy: " + StrategyToString(strategy);
return;
}
if (crossing.Any(x => x < 0 || x >= times.Length))
{
resultCode = Result.BadResult;
message = "incorrect person id, returned strategy: " + StrategyToString(strategy);
return;
}
for (int i = 0; i < crossing.Count; i++)
{
if ((fromLeftToRight && !leftRiverside.Contains(crossing[i])) || (!fromLeftToRight && !rightRiverside.Contains(crossing[i])))
{
resultCode = Result.BadResult;
message = "person " + crossing[i] + " is on the other river side, returned strategy " + StrategyToString(strategy);
return;
}
if (fromLeftToRight)
{
leftRiverside.Remove(crossing[i]);
rightRiverside.Add(crossing[i]);
}
else
{
rightRiverside.Remove(crossing[i]);
leftRiverside.Add(crossing[i]);
}
}
strategyResult += crossing.Max(x => times[x]);
fromLeftToRight = !fromLeftToRight;
}
if (leftRiverside.Count != 0)
{
resultCode = Result.BadResult;
message = "not everyone crossed bridge, returned stratedy: " + StrategyToString(strategy);
return;
}
if (result != strategyResult)
{
resultCode = Result.BadResult;
message = string.Format("incorrect result computed based on strategy: {0} (expected: {1}), reutned strategy: ", strategyResult, result, StrategyToString(strategy));
return;
}
resultCode = Result.Success;
message = "OK";
}
private string StrategyToString(List<List<int>> strategy)
{
StringBuilder result = new StringBuilder();
foreach (List<int> l in strategy)
{
result.Append("{");
if (l != null)
result.Append(String.Join(",", l));
result.Append("} ");
}
return result.ToString();
}
}
class Lab07
{
static void Main()
{
bool isExtraTests = true;
bool runCustomTests = true;
bool runLargeCustomTests = true;
bool runExtremelyLargeTests = true;
Console.WriteLine("Running boilerplate task");
long boilerplateTaskTimeElapsed = PerformBoilerplateTask();
Console.WriteLine("Boilerplate task done\n");
TestSet set = new TestSet();
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 1, 2, 5, 10 }, 17));
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 15, 10, 6, 7 }, 42));
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 10, 25, 20, 5 }, 60));
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 100 }, 100));
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 1, 20 }, 20));
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 1, 10, 100 }, 111));
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 2, 2, 2, 2, 2 }, 14));
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 1, 2, 3, 4, 5 }, 16));
set.TestCases.Add(new BridgeCrossingTestCase(5, new int[] { 1, 1, 5, 5, 10, 10 }, 22));
set.TestCases.Add(new BridgeCrossingTestCase(5, GenerateTestArray(5, 555), 284));
set.TestCases.Add(new BridgeCrossingTestCase(5, GenerateTestArray(6, 666), 346));
set.TestCases.Add(new BridgeCrossingTestCase(5, GenerateTestArray(7, 777), 216));
Console.WriteLine("\nBasic tests");
long[] elapsedTime = new long[5];
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
set.PreformTests(verbose: true, checkTimeLimit: false);
stopwatch.Stop();
elapsedTime[0] = stopwatch.ElapsedMilliseconds;
if (isExtraTests)
{
TestSet set2 = new TestSet();
set2.TestCases.Add(new BridgeCrossingTestCase(3, GenerateTestArray(8, 888), 313));
set2.TestCases.Add(new BridgeCrossingTestCase(30, GenerateTestArray(9, 999), 453));
Console.WriteLine("\nExtra tests");
stopwatch.Restart();
set2.PreformTests(verbose: true, checkTimeLimit: true);
stopwatch.Stop();
elapsedTime[1] = stopwatch.ElapsedMilliseconds;
}
if (runCustomTests)
{
TestSet set3 = new TestSet();
set3.TestCases.Add(new BridgeCrossingTestCase(3, GenerateTestArray(8, 123), 283));
set3.TestCases.Add(new BridgeCrossingTestCase(30, GenerateTestArray(9, 1234), 641));
set3.TestCases.Add(new BridgeCrossingTestCase(30, GenerateTestArray(9, 5678), 305));
set3.TestCases.Add(new BridgeCrossingTestCase(30, GenerateTestArray(9, 9012), 335));
set3.TestCases.Add(new BridgeCrossingTestCase(30, GenerateTestArray(9, 3456), 452));
set3.TestCases.Add(new BridgeCrossingTestCase(30, GenerateTestArray(9, 7890), 364));
Console.WriteLine("\nCustom tests");
stopwatch.Restart();
set3.PreformTests(verbose: true, checkTimeLimit: false);
stopwatch.Stop();
elapsedTime[2] = stopwatch.ElapsedMilliseconds;
}
if (runLargeCustomTests)
{
TestSet set4 = new TestSet();
set4.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(10, 2703), 249));
set4.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(10, 6969), 245));
set4.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(10, 1), 379));
Console.WriteLine("\nCustom large tests");
stopwatch.Restart();
set4.PreformTests(verbose: true, checkTimeLimit: false);
stopwatch.Stop();
elapsedTime[3] = stopwatch.ElapsedMilliseconds;
}
if (runExtremelyLargeTests)
{
TestSet set5 = new TestSet();
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(150, 1), 3678));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(250, 2), 6268));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(300, 3), 7537));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(400, 4), 10169));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(400, 5), 9862));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(500, 6), 12615));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(600, 7), 14124));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(1500, 8), 36810));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(3000, 9), 73827));
set5.TestCases.Add(new BridgeCrossingTestCase(300, GenerateTestArray(100000, 10), 2478340));
Console.WriteLine("\nCustom extremely large tests");
stopwatch.Restart();
set5.PreformTests(verbose: true, checkTimeLimit: false);
stopwatch.Stop();
elapsedTime[4] = stopwatch.ElapsedMilliseconds;
}
Console.WriteLine("Basic tests : {0,5} ms ({1:F3} times the boilerplate time)", elapsedTime[0], (double)elapsedTime[0] / boilerplateTaskTimeElapsed);
Console.WriteLine("Extra tests : {0,5} ms ({1:F3} times the boilerplate time)", elapsedTime[1], (double)elapsedTime[1] / boilerplateTaskTimeElapsed);
if (runCustomTests)
Console.WriteLine("Custom tests : {0,5} ms ({1:F3} times the boilerplate time)", elapsedTime[2], (double)elapsedTime[2] / boilerplateTaskTimeElapsed);
if (runLargeCustomTests)
Console.WriteLine("Large custom : {0,5} ms ({1:F3} times the boilerplate time)", elapsedTime[3], (double)elapsedTime[3] / boilerplateTaskTimeElapsed);
if (runExtremelyLargeTests)
Console.WriteLine("Extreme custom: {0,5} ms ({1:F3} times the boilerplate time)", elapsedTime[4], (double)elapsedTime[4] / boilerplateTaskTimeElapsed);
}
static int[] GenerateTestArray(int numberOfElements, int seed)
{
Random r = new Random(seed);
int[] testArray = new int[numberOfElements];
for (int i = 0; i < numberOfElements; i++) testArray[i] = r.Next(100);
return testArray;
}
static long PerformBoilerplateTask()
{
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
for (int i=0; i < 100000000; i++)
{
if (i * (1 - i) > 0)
continue;
}
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
}
}
Running boilerplate task
Boilerplate task done
Basic tests
Test 1: OK
Test 2: OK
Test 3: OK
Test 4: OK
Test 5: OK
Test 6: OK
Test 7: OK
Test 8: OK
Test 9: OK
Test 10: OK
Test 11: OK
Test 12: OK
Tests completed
12/12 passed - 12 OK, 0 low efficiency
0/12 failed - 0 error, 0 exception, 0 timeout
Extra tests
Test 1: OK
Test 2: OK
Tests completed
2/ 2 passed - 2 OK, 0 low efficiency
0/ 2 failed - 0 error, 0 exception, 0 timeout
Custom tests
Test 1: OK
Test 2: OK
Test 3: OK
Test 4: OK
Test 5: OK
Test 6: OK
Tests completed
6/ 6 passed - 6 OK, 0 low efficiency
0/ 6 failed - 0 error, 0 exception, 0 timeout
Custom large tests
Test 1: OK
Test 2: OK
Test 3: OK
Tests completed
3/ 3 passed - 3 OK, 0 low efficiency
0/ 3 failed - 0 error, 0 exception, 0 timeout
Custom extremely large tests
Test 1: OK
Test 2: OK
Test 3: OK
Test 4: OK
Test 5: OK
Test 6: OK
Test 7: OK
Test 8: OK
Test 9: OK
Test 10: OK
Tests completed
10/10 passed - 10 OK, 0 low efficiency
0/10 failed - 0 error, 0 exception, 0 timeout
Basic tests : 417 ms (1,688 times the boilerplate time)
Extra tests : 416 ms (1,684 times the boilerplate time)
Custom tests : 407 ms (1,648 times the boilerplate time)
Large custom : 407 ms (1,648 times the boilerplate time)
Extreme custom: 31748 ms (128,534 times the boilerplate time)
Running boilerplate task
Boilerplate task done
Basic tests
Test 1: OK
Test 2: OK
Test 3: OK
Test 4: OK
Test 5: OK
Test 6: OK
Test 7: OK
Test 8: OK
Test 9: OK
Test 10: OK
Test 11: OK
Test 12: OK
Tests completed
12/12 passed - 12 OK, 0 low efficiency
0/12 failed - 0 error, 0 exception, 0 timeout
Extra tests
Test 1: OK
Test 2: OK
Tests completed
2/ 2 passed - 2 OK, 0 low efficiency
0/ 2 failed - 0 error, 0 exception, 0 timeout
Custom tests
Test 1: OK
Test 2: OK
Test 3: OK
Test 4: OK
Test 5: OK
Test 6: OK
Tests completed
6/ 6 passed - 6 OK, 0 low efficiency
0/ 6 failed - 0 error, 0 exception, 0 timeout
Custom large tests
Test 1: OK
Test 2: OK
Test 3: OK
Tests completed
3/ 3 passed - 3 OK, 0 low efficiency
0/ 3 failed - 0 error, 0 exception, 0 timeout
Basic tests : 418 ms (1,646 times the boilerplate time)
Extra tests : 2455 ms (9,665 times the boilerplate time)
Custom tests : 15505 ms (61,043 times the boilerplate time)
Large custom : 32343 ms (127,335 times the boilerplate time)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment