From 3ea5ab3182b534909f0d7c8cea4d85f26435ab38 Mon Sep 17 00:00:00 2001 From: schwarz Date: Wed, 28 Apr 2021 16:58:07 +0200 Subject: [PATCH 1/4] added link on the forked repo --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d875a0..8d12081 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ Theatrical Players Refactoring Kata ==================================== The first chapter of ['Refactoring' by Martin Fowler, 2nd Edition](https://www.thoughtworks.com/books/refactoring2) contains a worked example of this exercise, in javascript. That chapter is available to download for free. This repo contains the starting point for this exercise in several languages, with tests, so you can try it out for yourself. +This repo was forked from https://github.com/emilybache/Theatrical-Players-Refactoring-Kata What you need to change ----------------------- @@ -13,4 +14,5 @@ In his book Fowler mentions that the first step in refactoring is always the sam Acknowledgements ---------------- -Thankyou to Martin Fowler for kindly giving permission to use his code. +Thank you to Martin Fowler for kindly giving permission to use his code. +Thank you to Emily Bache for creation of this kata. From e9458859bf4415613904fb718bf7c1b80b74ad4d Mon Sep 17 00:00:00 2001 From: schwarz Date: Fri, 30 Apr 2021 10:12:52 +0200 Subject: [PATCH 2/4] visibility of variables of classes are private --- java/src/main/java/Invoice.java | 12 ++++++++++-- java/src/main/java/Performance.java | 12 ++++++++++-- java/src/main/java/Play.java | 12 ++++++++++-- java/src/main/java/StatementPrinter.java | 24 ++++++++++++------------ 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/java/src/main/java/Invoice.java b/java/src/main/java/Invoice.java index 1475e8f..86f1fa2 100644 --- a/java/src/main/java/Invoice.java +++ b/java/src/main/java/Invoice.java @@ -2,11 +2,19 @@ import java.util.List; public class Invoice { - public String customer; - public List performances; + private String customer; + private List performances; public Invoice(String customer, List performances) { this.customer = customer; this.performances = performances; } + + public String getCustomer() { + return customer; + } + + public List getPerformances() { + return performances; + } } diff --git a/java/src/main/java/Performance.java b/java/src/main/java/Performance.java index ac7093f..b1858bc 100644 --- a/java/src/main/java/Performance.java +++ b/java/src/main/java/Performance.java @@ -1,10 +1,18 @@ public class Performance { - public String playID; - public int audience; + private String playID; + private int audience; public Performance(String playID, int audience) { this.playID = playID; this.audience = audience; } + + public String getPlayID() { + return playID; + } + + public int getAudience() { + return audience; + } } diff --git a/java/src/main/java/Play.java b/java/src/main/java/Play.java index 59552f4..4a034c3 100644 --- a/java/src/main/java/Play.java +++ b/java/src/main/java/Play.java @@ -1,10 +1,18 @@ public class Play { - public String name; - public String type; + private String name; + private String type; public Play(String name, String type) { this.name = name; this.type = type; } + + public String getName() { + return name; + } + + public String getType() { + return type; + } } diff --git a/java/src/main/java/StatementPrinter.java b/java/src/main/java/StatementPrinter.java index d0c05a9..dcf4531 100644 --- a/java/src/main/java/StatementPrinter.java +++ b/java/src/main/java/StatementPrinter.java @@ -7,39 +7,39 @@ public class StatementPrinter { public String print(Invoice invoice, Map plays) { var totalAmount = 0; var volumeCredits = 0; - var result = String.format("Statement for %s\n", invoice.customer); + var result = String.format("Statement for %s\n", invoice.getCustomer()); NumberFormat frmt = NumberFormat.getCurrencyInstance(Locale.US); - for (var perf : invoice.performances) { - var play = plays.get(perf.playID); + for (var perf : invoice.getPerformances()) { + var play = plays.get(perf.getPlayID()); var thisAmount = 0; - switch (play.type) { + switch (play.getType()) { case "tragedy": thisAmount = 40000; - if (perf.audience > 30) { - thisAmount += 1000 * (perf.audience - 30); + if (perf.getAudience() > 30) { + thisAmount += 1000 * (perf.getAudience() - 30); } break; case "comedy": thisAmount = 30000; - if (perf.audience > 20) { - thisAmount += 10000 + 500 * (perf.audience - 20); + if (perf.getAudience() > 20) { + thisAmount += 10000 + 500 * (perf.getAudience() - 20); } - thisAmount += 300 * perf.audience; + thisAmount += 300 * perf.getAudience(); break; default: throw new Error("unknown type: ${play.type}"); } // add volume credits - volumeCredits += Math.max(perf.audience - 30, 0); + volumeCredits += Math.max(perf.getAudience() - 30, 0); // add extra credit for every ten comedy attendees - if ("comedy".equals(play.type)) volumeCredits += Math.floor(perf.audience / 5); + if ("comedy".equals(play.getType())) volumeCredits += Math.floor(perf.getAudience() / 5); // print line for this order - result += String.format(" %s: %s (%s seats)\n", play.name, frmt.format(thisAmount / 100), perf.audience); + result += String.format(" %s: %s (%s seats)\n", play.getName(), frmt.format(thisAmount / 100), perf.getAudience()); totalAmount += thisAmount; } result += String.format("Amount owed is %s\n", frmt.format(totalAmount / 100)); From 87c84269d9099103c2d2cf44df57adbdb9c36a3c Mon Sep 17 00:00:00 2001 From: schwarz Date: Fri, 30 Apr 2021 10:21:08 +0200 Subject: [PATCH 3/4] added example tests --- ...terTests.exampleStatementHtml.approved.txt | 11 +++++++++ ...ts.exampleStatementPlainText.approved.txt} | 0 java/src/test/java/StatementPrinterTests.java | 23 ++++++++++++++++++- ...sts.statementWithNewPlayTypes.approved.txt | 5 ++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 java/src/test/java/StatementPrinterTests.exampleStatementHtml.approved.txt rename java/src/test/java/{StatementPrinterTests.exampleStatement.approved.txt => StatementPrinterTests.exampleStatementPlainText.approved.txt} (100%) create mode 100644 java/src/test/java/StatementPrinterTests.statementWithNewPlayTypes.approved.txt diff --git a/java/src/test/java/StatementPrinterTests.exampleStatementHtml.approved.txt b/java/src/test/java/StatementPrinterTests.exampleStatementHtml.approved.txt new file mode 100644 index 0000000..eab64e9 --- /dev/null +++ b/java/src/test/java/StatementPrinterTests.exampleStatementHtml.approved.txt @@ -0,0 +1,11 @@ + +

Statement for BigCo

+ + + + + +
playseatscost
Hamlet55$650.00
As You Like It35$580.00
Othello40$500.00
+

Amount owed is $1,730.00

+

You earned 47 credits

+ \ No newline at end of file diff --git a/java/src/test/java/StatementPrinterTests.exampleStatement.approved.txt b/java/src/test/java/StatementPrinterTests.exampleStatementPlainText.approved.txt similarity index 100% rename from java/src/test/java/StatementPrinterTests.exampleStatement.approved.txt rename to java/src/test/java/StatementPrinterTests.exampleStatementPlainText.approved.txt diff --git a/java/src/test/java/StatementPrinterTests.java b/java/src/test/java/StatementPrinterTests.java index 71d6e14..8cc2dfb 100644 --- a/java/src/test/java/StatementPrinterTests.java +++ b/java/src/test/java/StatementPrinterTests.java @@ -9,7 +9,7 @@ import static org.approvaltests.Approvals.verify; public class StatementPrinterTests { @Test - void exampleStatement() { + void exampleStatementPlainText() { Map plays = Map.of( "hamlet", new Play("Hamlet", "tragedy"), "as-like", new Play("As You Like It", "comedy"), @@ -26,6 +26,25 @@ public class StatementPrinterTests { verify(result); } + @Test + void exampleStatementHtml() { + Map plays = Map.of( + "hamlet", new Play("Hamlet", "tragedy"), + "as-like", new Play("As You Like It", "comedy"), + "othello", new Play("Othello", "tragedy")); + + Invoice invoice = new Invoice("BigCo", List.of( + new Performance("hamlet", 55), + new Performance("as-like", 35), + new Performance("othello", 40))); + + StatementPrinter statementPrinter = new StatementPrinter(); + + // Not implemented yet + // var result = statementPrinter.printAsHtml(invoice, plays); + // verify(result); + } + @Test void statementWithNewPlayTypes() { Map plays = Map.of( @@ -37,6 +56,8 @@ public class StatementPrinterTests { new Performance("as-like", 55))); StatementPrinter statementPrinter = new StatementPrinter(); + + // Not implemented yet Assertions.assertThrows(Error.class, () -> { statementPrinter.print(invoice, plays); }); diff --git a/java/src/test/java/StatementPrinterTests.statementWithNewPlayTypes.approved.txt b/java/src/test/java/StatementPrinterTests.statementWithNewPlayTypes.approved.txt new file mode 100644 index 0000000..c17709a --- /dev/null +++ b/java/src/test/java/StatementPrinterTests.statementWithNewPlayTypes.approved.txt @@ -0,0 +1,5 @@ +Statement for BigCo + Henry V: $100.00 (53 seats) + As You Like It: $100.00 (55 seats) +Amount owed is $200.00 +You earned 48 credits \ No newline at end of file From 6bc1d738197be84189c004205b68e1417de5f8d7 Mon Sep 17 00:00:00 2001 From: schwarz Date: Fri, 30 Apr 2021 12:45:16 +0200 Subject: [PATCH 4/4] example tests updated --- .../StatementPrinterTests.cs | 33 ++++++++++++++++--- ...terTests.exampleStatementHtml.approved.txt | 11 +++++++ ...sts.statementWithNewPlayTypes.approved.txt | 5 +++ ...statement_plain_text_example.approved.txt} | 0 ...atricalPlayersRefactoringKata.Tests.csproj | 17 ++++++---- ...layersRefactoringKata.sln.DotSettings.user | 6 ++++ .../TheatricalPlayersRefactoringKata.csproj | 3 +- csharp/global.json | 5 +++ 8 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.exampleStatementHtml.approved.txt create mode 100644 csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.statementWithNewPlayTypes.approved.txt rename csharp/TheatricalPlayersRefactoringKata.Tests/{StatementPrinterTests.test_statement_example.approved.txt => StatementPrinterTests.test_statement_plain_text_example.approved.txt} (100%) create mode 100644 csharp/TheatricalPlayersRefactoringKata.sln.DotSettings.user create mode 100644 csharp/global.json diff --git a/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.cs b/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.cs index 69844f2..1a2bf15 100644 --- a/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.cs +++ b/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.cs @@ -2,15 +2,16 @@ using System; using System.Collections.Generic; using ApprovalTests; using ApprovalTests.Reporters; -using Xunit; +using NUnit.Framework; namespace TheatricalPlayersRefactoringKata.Tests { + [TestFixture] public class StatementPrinterTests { - [Fact] + [Test] [UseReporter(typeof(DiffReporter))] - public void test_statement_example() + public void test_statement_plain_text_example() { var plays = new Dictionary(); plays.Add("hamlet", new Play("Hamlet", "tragedy")); @@ -23,10 +24,32 @@ namespace TheatricalPlayersRefactoringKata.Tests StatementPrinter statementPrinter = new StatementPrinter(); var result = statementPrinter.Print(invoice, plays); - + Approvals.Verify(result); } - [Fact] + + [Test] + [UseReporter(typeof(DiffReporter))] + public void test_statement_html_example() + { + var plays = new Dictionary(); + plays.Add("hamlet", new Play("Hamlet", "tragedy")); + plays.Add("as-like", new Play("As You Like It", "comedy")); + plays.Add("othello", new Play("Othello", "tragedy")); + + Invoice invoice = new Invoice("BigCo", new List{new Performance("hamlet", 55), + new Performance("as-like", 35), + new Performance("othello", 40)}); + + StatementPrinter statementPrinter = new StatementPrinter(); + + // Not implemented yet + // var result = statementPrinter.PrintAsHtml(invoice, plays); + // Approvals.Verify(result); + } + + [Test] + [UseReporter(typeof(DiffReporter))] public void test_statement_with_new_play_types() { var plays = new Dictionary(); diff --git a/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.exampleStatementHtml.approved.txt b/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.exampleStatementHtml.approved.txt new file mode 100644 index 0000000..1711d70 --- /dev/null +++ b/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.exampleStatementHtml.approved.txt @@ -0,0 +1,11 @@ + +

Statement for BigCo

+ + + + + +
playseatscost
Hamlet55$650.00
As You Like It35$580.00
Othello40$500.00
+

Amount owed is $1,730.00

+

You earned 47 credits

+ \ No newline at end of file diff --git a/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.statementWithNewPlayTypes.approved.txt b/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.statementWithNewPlayTypes.approved.txt new file mode 100644 index 0000000..5a2f4a2 --- /dev/null +++ b/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.statementWithNewPlayTypes.approved.txt @@ -0,0 +1,5 @@ +Statement for BigCo + Henry V: $100.00 (53 seats) + As You Like It: $100.00 (55 seats) +Amount owed is $200.00 +You earned 48 credits \ No newline at end of file diff --git a/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.test_statement_example.approved.txt b/csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.test_statement_plain_text_example.approved.txt similarity index 100% rename from csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.test_statement_example.approved.txt rename to csharp/TheatricalPlayersRefactoringKata.Tests/StatementPrinterTests.test_statement_plain_text_example.approved.txt diff --git a/csharp/TheatricalPlayersRefactoringKata.Tests/TheatricalPlayersRefactoringKata.Tests.csproj b/csharp/TheatricalPlayersRefactoringKata.Tests/TheatricalPlayersRefactoringKata.Tests.csproj index 8ee87f1..916cf3a 100644 --- a/csharp/TheatricalPlayersRefactoringKata.Tests/TheatricalPlayersRefactoringKata.Tests.csproj +++ b/csharp/TheatricalPlayersRefactoringKata.Tests/TheatricalPlayersRefactoringKata.Tests.csproj @@ -1,20 +1,23 @@ - netcoreapp2.2 - + net5.0 false - - - + + + + + + + - - + + diff --git a/csharp/TheatricalPlayersRefactoringKata.sln.DotSettings.user b/csharp/TheatricalPlayersRefactoringKata.sln.DotSettings.user new file mode 100644 index 0000000..e7f7734 --- /dev/null +++ b/csharp/TheatricalPlayersRefactoringKata.sln.DotSettings.user @@ -0,0 +1,6 @@ + + <SessionState ContinuousTestingMode="0" IsActive="True" Name="StatementPrinterTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::47FAD5CE-0FB3-4C9F-A430-68E58A1B094F::net5.0::TheatricalPlayersRefactoringKata.Tests.StatementPrinterTests</TestId> + </TestAncestor> +</SessionState> \ No newline at end of file diff --git a/csharp/TheatricalPlayersRefactoringKata/TheatricalPlayersRefactoringKata.csproj b/csharp/TheatricalPlayersRefactoringKata/TheatricalPlayersRefactoringKata.csproj index 72764a6..1601b0f 100644 --- a/csharp/TheatricalPlayersRefactoringKata/TheatricalPlayersRefactoringKata.csproj +++ b/csharp/TheatricalPlayersRefactoringKata/TheatricalPlayersRefactoringKata.csproj @@ -1,7 +1,8 @@ - netstandard2.0 + net5.0 + false diff --git a/csharp/global.json b/csharp/global.json new file mode 100644 index 0000000..8c50959 --- /dev/null +++ b/csharp/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "5.0.103" + } +} \ No newline at end of file