Skip to content

add connect generator and modify class to accept array input #464

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 9, 2017
Merged
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
2 changes: 1 addition & 1 deletion exercises/connect/Connect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public enum ConnectWinner

public class Connect
{
public Connect(string input)
public Connect(string[] input)
{
throw new NotImplementedException("You need to implement this function.");
}
Expand Down
205 changes: 120 additions & 85 deletions exercises/connect/ConnectTest.cs
Original file line number Diff line number Diff line change
@@ -1,124 +1,159 @@
using Xunit;
using System.Linq;
// This file was auto-generated based on version 1.0.0 of the canonical data.

using Xunit;

public class ConnectTest
{
private static string MakeBoard(string[] board)
[Fact]
public void An_empty_board_has_no_winner()
{
return string.Join("\n", board.Select(x => x.Replace(" ", "")));
var board = new []
{
". . . . .",
" . . . . .",
" . . . . .",
" . . . . .",
" . . . . ."

};
var sut = new Connect(board);
Assert.Equal(ConnectWinner.None, sut.Result());
}

[Fact]
public void Empty_board_has_no_winner()
[Fact(Skip = "Remove to run test")]
public void X_can_win_on_a_1x1_board()
{
var board = new []
{
"X"
};
var sut = new Connect(board);
Assert.Equal(ConnectWinner.Black, sut.Result());
}

[Fact(Skip = "Remove to run test")]
public void O_can_win_on_a_1x1_board()
{
var lines = new[]
{
". . . . . ",
" . . . . . ",
" . . . . . ",
" . . . . . ",
" . . . . ."
};
var board = new Connect(MakeBoard(lines));
Assert.Equal(ConnectWinner.None, board.Result());
var board = new []
{
"O"
};
var sut = new Connect(board);
Assert.Equal(ConnectWinner.White, sut.Result());
}

[Fact(Skip = "Remove to run test")]
public void One_by_one_board_with_black_stone()
public void Only_edges_does_not_make_a_winner()
{
var lines = new[] { "X" };
var board = new Connect(MakeBoard(lines));
Assert.Equal(ConnectWinner.Black, board.Result());
var board = new []
{
"O O O X",
" X . . X",
" X . . X",
" X O O O"

};
var sut = new Connect(board);
Assert.Equal(ConnectWinner.None, sut.Result());
}

[Fact(Skip = "Remove to run test")]
public void One_by_one_board_with_white_stone()
public void Illegal_diagonal_does_not_make_a_winner()
{
var lines = new[] { "O" };
var board = new Connect(MakeBoard(lines));
Assert.Equal(ConnectWinner.White, board.Result());
var board = new []
{
"X O . .",
" O X X X",
" O X O .",
" . O X .",
" X X O O"

};
var sut = new Connect(board);
Assert.Equal(ConnectWinner.None, sut.Result());
}

[Fact(Skip = "Remove to run test")]
public void Convoluted_path()
public void Nobody_wins_crossing_adjacent_angles()
{
var lines = new[]
{
". X X . . ",
" X . X . X ",
" . X . X . ",
" . X X . . ",
" O O O O O"
};
var board = new Connect(MakeBoard(lines));
Assert.Equal(ConnectWinner.Black, board.Result());
var board = new []
{
"X . . .",
" . X O .",
" O . X O",
" . O . X",
" . . O ."

};
var sut = new Connect(board);
Assert.Equal(ConnectWinner.None, sut.Result());
}

[Fact(Skip = "Remove to run test")]
public void Rectangle_black_wins()
public void X_wins_crossing_from_left_to_right()
{
var lines = new[]
{
". O . . ",
" O X X X ",
" O X O . ",
" X X O X ",
" . O X ."
};
var board = new Connect(MakeBoard(lines));
Assert.Equal(ConnectWinner.Black, board.Result());
var board = new []
{
". O . .",
" O X X X",
" O X O .",
" X X O X",
" . O X ."

};
var sut = new Connect(board);
Assert.Equal(ConnectWinner.Black, sut.Result());
}

[Fact(Skip = "Remove to run test")]
public void Rectangle_white_wins()
public void O_wins_crossing_from_top_to_bottom()
{
var lines = new[]
{
". O . . ",
" O X X X ",
" O O O . ",
" X X O X ",
" . O X ."
};
var board = new Connect(MakeBoard(lines));
Assert.Equal(ConnectWinner.White, board.Result());
var board = new []
{
". O . .",
" O X X X",
" O O O .",
" X X O X",
" . O X ."

};
var sut = new Connect(board);
Assert.Equal(ConnectWinner.White, sut.Result());
}

[Fact(Skip = "Remove to run test")]
public void Spiral_black_wins()
public void X_wins_using_a_convoluted_path()
{
var lines = new[]
{
"OXXXXXXXX",
"OXOOOOOOO",
"OXOXXXXXO",
"OXOXOOOXO",
"OXOXXXOXO",
"OXOOOXOXO",
"OXXXXXOXO",
"OOOOOOOXO",
"XXXXXXXXO"
var board = new []
{
". X X . .",
" X . X . X",
" . X . X .",
" . X X . .",
" O O O O O"

};
var board = new Connect(MakeBoard(lines));
Assert.Equal(ConnectWinner.Black, board.Result());
var sut = new Connect(board);
Assert.Equal(ConnectWinner.Black, sut.Result());
}

[Fact(Skip = "Remove to run test")]
public void Spiral_nobody_wins()
public void X_wins_using_a_spiral_path()
{
var lines = new[]
{
"OXXXXXXXX",
"OXOOOOOOO",
"OXOXXXXXO",
"OXOXOOOXO",
"OXOX.XOXO",
"OXOOOXOXO",
"OXXXXXOXO",
"OOOOOOOXO",
"XXXXXXXXO"
var board = new []
{
"O X X X X X X X X",
" O X O O O O O O O",
" O X O X X X X X O",
" O X O X O O O X O",
" O X O X X X O X O",
" O X O O O X O X O",
" O X X X X X O X O",
" O O O O O O O X O",
" X X X X X X X X O"

};
var board = new Connect(MakeBoard(lines));
Assert.Equal(ConnectWinner.None, board.Result());
var sut = new Connect(board);
Assert.Equal(ConnectWinner.Black, sut.Result());
}
}
18 changes: 11 additions & 7 deletions exercises/connect/Example.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

public enum ConnectWinner
{
Expand All @@ -20,7 +21,7 @@ private enum Cell

private readonly Cell[][] board;

public Connect(string input)
public Connect(string[] input)
{
board = ParseBoard(input);
}
Expand All @@ -35,13 +36,16 @@ private static Cell CharToCell(char c)
}
}

private static Cell[][] ParseBoard(string input)
private static Cell[][] ParseBoard(string[] input)
{
var split = input.Split('\n');
var rows = split.Length;
var cols = split[0].Length;

return split.Select(row => row.Select(CharToCell).ToArray()).ToArray();
var rows = input.Length;
var cols = input[0].Length;
var filtered = new List<string>();
foreach (var str in input)
{
filtered.Add(Regex.Replace(str, @"\s+", ""));
}
return filtered.Select(row => row.Select(CharToCell).ToArray()).ToArray();
}

private int Cols => board[0].Length;
Expand Down
47 changes: 47 additions & 0 deletions generators/Exercises/Connect.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using Generators.Input;
using Generators.Output;

namespace Generators.Exercises
{
public class Connect : Exercise
{
protected override void UpdateCanonicalData(CanonicalData canonicalData)
{
foreach (var canonicalDataCase in canonicalData.Cases)
{
canonicalDataCase.UseVariablesForConstructorParameters = true;
canonicalDataCase.SetConstructorInputParameters("board");
canonicalDataCase.Property = "result";
canonicalDataCase.Properties["board"] = ToMultiLineString(canonicalDataCase.Properties["board"]);

//convert to enum
switch (canonicalDataCase.Properties["expected"])
{
case "X":
canonicalDataCase.Properties["expected"] = new UnescapedValue("ConnectWinner.Black");
break;
case "O":
canonicalDataCase.Properties["expected"] = new UnescapedValue("ConnectWinner.White");
break;
case "":
canonicalDataCase.Properties["expected"] = new UnescapedValue("ConnectWinner.None");
break;
}
}
}

private UnescapedValue ToMultiLineString(string[] input)
{
const string template =
@"new []
{
{% if input.size == 0 %}string.Empty{% else %}{% for item in {{input}} %}{% if forloop.length == 1 %}""{{item}}""{% break %}{% endif %}""{{item}}""{% if forloop.last == false %},{% else %}{{string.Empty}}{% endif %}
{% endfor %}{% endif %}
}";

return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input }));
}
}
}