CpLibrary

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub fairy-lettuce/CpLibrary

:heavy_check_mark: CpLibrary.Test/Judge/Checker/SpecialCheckerTest.cs

Depends on

Code

using System;
using System.IO;
using System.Linq;
using System.Threading;
using Xunit;
using CpLibrary.Judge.Checker;
using FluentAssertions;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace CpLibrary.Test.Judge.Checker
{
	public class SpecialCheckerTest
	{
		// Problem: Given a positive integer x, output two positive integers a, b such that a + b = z
		// If there are no solutions, just output `-1`.

		public static JudgeStatus Judge(StreamReader input, StreamReader expected, StreamReader actual)
		{
			var srInput = new Scanner(input);
			var srActual = new Scanner(actual);
			var x = srInput.ReadInt();
			if (x == 1)
			{
				var actualStr = srActual.ReadString();
				if (actualStr != "-1")
				{
					return JudgeStatus.WA;
				}
				return JudgeStatus.AC;
			}
			var (a, b) = srActual.ReadValue<int, int>();
			if (a + b != x)
			{
				return JudgeStatus.WA;
			}
			return JudgeStatus.AC;
		}

		[Theory]
		[InlineData(10, 1000)]
		[InlineData(1, 1000)]
		public static void AcceptedTest(int x, int timeLimit)
		{
			void Actual(StreamReader reader, StreamWriter writer)
			{
				var sr = new Scanner(reader);
				var x = sr.ReadInt();
				if (x == 1) writer.WriteLine(-1);
				else writer.WriteLine($"{x - 1} {1}");
			}

			var checker = new SpecialChecker(Actual, Judge);
			checker.TimeLimit = TimeSpan.FromMilliseconds(timeLimit);
			var input = $"{x}\n";
			var output = $"\n";
			var result = checker.Run(input, output);
			result.Status.Should().Be(JudgeStatus.AC);
		}

		[Theory]
		[InlineData(1, 1000)]
		public static void WrongAnswerTest(int x, int timeLimit)
		{
			void Actual(StreamReader reader, StreamWriter writer)
			{
				var sr = new Scanner(reader);
				var x = sr.ReadInt();
				writer.WriteLine($"{x - 1} {1}");
			}

			var checker = new SpecialChecker(Actual, Judge);
			checker.TimeLimit = TimeSpan.FromMilliseconds(timeLimit);
			var input = $"{x}\n";
			var output = $"\n";
			var result = checker.Run(input, output);
			result.Status.Should().Be(JudgeStatus.WA);
		}

		[Theory]
		[InlineData(1, 500, 600)]
		public static void TimeLimitExceededTest(int x, int timeLimit, int waitTime)
		{
			void Actual(StreamReader reader, StreamWriter writer)
			{
				Thread.Sleep(waitTime);
				var sr = new Scanner(reader);
				var x = sr.ReadInt();
				if (x == 1) writer.WriteLine(-1);
				else writer.WriteLine($"{x - 1} {1}");
			}

			var checker = new SpecialChecker(Actual, Judge);
			checker.TimeLimit = TimeSpan.FromMilliseconds(timeLimit);
			var input = $"{x}\n";
			var output = $"\n";
			var result = checker.Run(input, output);
			result.Status.Should().Be(JudgeStatus.TLE);
		}

		[Theory]
		[InlineData(1, 1000)]
		public static void RuntimeErrorTest(int x, int timeLimit)
		{
			void Actual(StreamReader reader, StreamWriter writer)
			{
				throw new Exception("Test");
			}

			var checker = new SpecialChecker(Actual, Judge);
			checker.TimeLimit = TimeSpan.FromMilliseconds(timeLimit);
			var input = $"{x}\n";
			var output = $"\n";
			var result = checker.Run(input, output);
			result.Status.Should().Be(JudgeStatus.RE);
		}
	}
}
Back to top page