Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.vs/
bin/
obj/

TestResults/
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.3" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.3" />
<PackageReference Include="coverlet.collector" Version="3.0.2" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\CashDrawer.App\CashDrawer.App.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="FileReaderTests\InputFileReaderData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="MainTests\InputFile-Good.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="MainTests\InputFile-Empty.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1.00,2.00
3.00,4.00
5.00,6.00
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using CashDrawer.App.FileReaders;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace CashDrawer.App.Tests.FileReaderTests
{
[TestClass]
public class InputFileReaderTests
{

[TestMethod]
public void file_reader_reads_input_from_a_file()
{
var filename = @"FileReaderTests\InputFileReaderData.txt";

var reader = new InputFileReader(filename, new LineParser());

Assert.IsTrue(reader.HaveMore);
var line = reader.Next();
Assert.IsFalse(line.HasError);
Assert.AreEqual(1.00m, line.Due);
Assert.AreEqual(2.00m, line.Paid);

Assert.IsTrue(reader.HaveMore);
line = reader.Next();
Assert.IsFalse(line.HasError);
Assert.AreEqual(3.00m, line.Due);
Assert.AreEqual(4.00m, line.Paid);

Assert.IsTrue(reader.HaveMore);
line = reader.Next();
Assert.IsFalse(line.HasError);
Assert.AreEqual(5.00m, line.Due);
Assert.AreEqual(6.00m, line.Paid);

Assert.IsFalse(reader.HaveMore);
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
using CashDrawer.App.FileReaders;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace CashDrawer.App.Tests.FileReaderTests
{

[TestClass]
public class LineParserTests
{

[TestMethod]
public void parser_can_parse_line_with_good_due_and_paid_values()
{
var line = "10.00,12.00";

var parser = new LineParser();
var result = parser.Parse(line);

Assert.IsFalse(result.HasError);
Assert.AreEqual(10.00m, result.Due);
Assert.AreEqual(12.00m, result.Paid);
}



[TestMethod]
public void parser_ignores_white_space()
{
var line = " 10.00 , 12.00 ";

var parser = new LineParser();
var result = parser.Parse(line);

Assert.IsFalse(result.HasError);
Assert.AreEqual(10.00m, result.Due);
Assert.AreEqual(12.00m, result.Paid);
}



[TestMethod]
[DataRow("1.00")]
[DataRow("1.00,")]
[DataRow("1.00, 2.00, 3.00")]
[DataRow("")]
[DataRow(",")]
public void parser_returns_error_if_not_two_amounts_on_line(string line)
{
var parser = new LineParser();
var result = parser.Parse(line);

Assert.IsTrue(result.HasError);
Assert.AreEqual("Invalid line. Expected format <due>,<paid>", result.Error);
}



[TestMethod]
public void parser_returns_error_if_invalid_due_amount()
{
var line = "X.XX, 1.00";

var parser = new LineParser();
var result = parser.Parse(line);

Assert.IsTrue(result.HasError);
Assert.AreEqual("Invalid amount 'X.XX'", result.Error);
}



[TestMethod]
public void parser_returns_error_if_invalid_paid_amount()
{
var line = "1.00, X.XX";

var parser = new LineParser();
var result = parser.Parse(line);

Assert.IsTrue(result.HasError);
Assert.AreEqual("Invalid amount 'X.XX'", result.Error);
}



[TestMethod]
[DataRow("1 , 0.00", "Invalid amount '1'. Amount must have 2 digits after the decimal.")]
[DataRow("1. , 0.00", "Invalid amount '1.'. Amount must have 2 digits after the decimal.")]
[DataRow("1.1 , 0.00", "Invalid amount '1.1'. Amount must have 2 digits after the decimal.")]
public void parser_returns_error_if_due_amount_does_not_have_exactly_two_digits_after_decimal(string line, string expectedError)
{
var parser = new LineParser();
var result = parser.Parse(line);

Assert.IsTrue(result.HasError);
Assert.AreEqual(expectedError, result.Error);
}



[TestMethod]
[DataRow("0.00, 1 ", "Invalid amount '1'. Amount must have 2 digits after the decimal.")]
[DataRow("0.00, 1. ", "Invalid amount '1.'. Amount must have 2 digits after the decimal.")]
[DataRow("0.00, 1.1 ", "Invalid amount '1.1'. Amount must have 2 digits after the decimal.")]
public void parser_returns_error_if_paid_amount_does_not_have_exactly_two_digits_after_decimal(string line, string expectedError)
{
var parser = new LineParser();
var result = parser.Parse(line);

Assert.IsTrue(result.HasError);
Assert.AreEqual(expectedError, result.Error);
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
using CashDrawer.App.FileWriters;
using CashDrawer.Core;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace CashDrawer.App.Tests.FileWriterTests
{
[TestClass]
public class HumanizerTests
{

[TestMethod]
public void humanizer_converts_change_to_friendly_string()
{

var change = new Change(5, 4, 3, 2, 1);
var humanizer = new Humanizer();
var text = humanizer.Humanize(change);

Assert.AreEqual("5 dollars, 4 quarters, 3 dimes, 2 nickles, 1 penny", text);
}



[TestMethod]
public void humanizer_converts_uses_singular_nouns_when_change_values_are_1()
{

var change = new Change(1, 1, 1, 1, 1);
var humanizer = new Humanizer();
var text = humanizer.Humanize(change);

Assert.AreEqual("1 dollar, 1 quarter, 1 dime, 1 nickle, 1 penny", text);
}



[TestMethod]
public void humanizer_converts_uses_plural_nouns_when_change_values_are_greater_than_0()
{

var change = new Change(2, 2, 2, 2, 2);
var humanizer = new Humanizer();
var text = humanizer.Humanize(change);

Assert.AreEqual("2 dollars, 2 quarters, 2 dimes, 2 nickles, 2 pennies", text);
}



[TestMethod]
[DataRow(0, 1, 1, 1, 1, "1 quarter, 1 dime, 1 nickle, 1 penny")]
[DataRow(1, 0, 1, 1, 1, "1 dollar, 1 dime, 1 nickle, 1 penny")]
[DataRow(1, 1, 0, 1, 1, "1 dollar, 1 quarter, 1 nickle, 1 penny")]
[DataRow(1, 1, 1, 0, 1, "1 dollar, 1 quarter, 1 dime, 1 penny")]
[DataRow(1, 1, 1, 1, 0, "1 dollar, 1 quarter, 1 dime, 1 nickle")]
public void humanizer_does_not_display_change_amount_if_value_is_zero(int dollars,
int quarters,
int dimes,
int nickles,
int pennies,
string expectedText)
{
var change = new Change(dollars, quarters, dimes, nickles, pennies);
var humanizer = new Humanizer();
var text = humanizer.Humanize(change);

Assert.AreEqual(expectedText, text);
}



[TestMethod]
public void humanizer_returns_message_if_no_change_due()
{

var change = new Change(0, 0, 0, 0, 0);
var humanizer = new Humanizer();
var text = humanizer.Humanize(change);

Assert.AreEqual("no change due", text);
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using CashDrawer.App.FileWriters;
using CashDrawer.Core;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;

namespace CashDrawer.App.Tests.FileWriterTests
{
[TestClass]
public class OutputFileWriterTests
{

[TestMethod]
public void file_writer_writes_change_to_a_file()
{
var filename = "FileWriterTest.txt";

File.Delete(filename);

var writer = new OutputFileWriter(filename, new Humanizer());

var change1 = new Change(0, 1, 2, 3, 4);
var change2 = new Change(5, 6, 7, 8, 9);
writer.Write(change1);
writer.Write(change2);

var output = File.ReadAllLines(filename);

Assert.AreEqual(2, output.Length);
Assert.AreEqual("1 quarter, 2 dimes, 3 nickles, 4 pennies", output[0]);
Assert.AreEqual("5 dollars, 6 quarters, 7 dimes, 8 nickles, 9 pennies", output[1]);
}

}
}
28 changes: 28 additions & 0 deletions CreativeCashDrawer/CashDrawer.App.Tests/Helpers/DummyConsole.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using System.IO;

namespace CashDrawer.App.Tests.Helpers
{
public sealed class DummyConsole : IDisposable
{
private readonly TextWriter _oldWriter;
private readonly StringWriter _newWriter;

public string Text => _newWriter.ToString();


public DummyConsole()
{
_newWriter = new StringWriter();
_oldWriter = Console.Out;
Console.SetOut(_newWriter);
}


public void Dispose()
{
Console.SetOut(_oldWriter);
_newWriter.Dispose();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
2.12,3.00
1.97,2.00
Loading