Skip to content

Commit 3110183

Browse files
bmeverettErikSchierboom
authored andcommitted
423 triangle generator (#458)
* update Triangle example and class * update triangle generator and triangle example * update types in example to match Triangle.cs * update everything to use double and make sure tests pass
1 parent e85c9dc commit 3110183

File tree

4 files changed

+122
-39
lines changed

4 files changed

+122
-39
lines changed

exercises/triangle/Example.cs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,36 @@ public enum TriangleKind
55
{
66
Equilateral,
77
Isosceles,
8-
Scalene
8+
Scalene,
9+
Invalid
910
}
1011

1112
public static class Triangle
1213
{
13-
public static TriangleKind Kind(decimal side1, decimal side2, decimal side3)
14+
15+
public static bool IsScalene(double side1, double side2, double side3)
16+
{
17+
return Kind(side1, side2, side3) == TriangleKind.Scalene;
18+
}
19+
20+
public static bool IsIsosceles(double side1, double side2, double side3)
21+
{
22+
var triangle = Kind(side1, side2, side3);
23+
return triangle == TriangleKind.Isosceles || triangle == TriangleKind.Equilateral;
24+
}
25+
26+
public static bool IsEquilateral(double side1, double side2, double side3)
27+
{
28+
return Kind(side1, side2, side3) == TriangleKind.Equilateral;
29+
}
30+
31+
private static TriangleKind Kind(double side1, double side2, double side3)
1432
{
1533
if (AllSidesAreZero(side1, side2, side3) ||
1634
HasImpossibleSides(side1, side2, side3) ||
1735
ViolatesTriangleInequality(side1, side2, side3))
1836
{
19-
throw new TriangleException();
37+
return TriangleKind.Invalid;
2038
}
2139

2240
int uniqueSides = UniqueSides(side1, side2, side3);
@@ -27,24 +45,24 @@ public static TriangleKind Kind(decimal side1, decimal side2, decimal side3)
2745
return TriangleKind.Scalene;
2846
}
2947

30-
private static bool AllSidesAreZero(decimal side1, decimal side2, decimal side3)
48+
private static bool AllSidesAreZero(double side1, double side2, double side3)
3149
{
3250
return side1 == 0 && side2 == 0 && side3 == 0;
3351
}
3452

35-
private static bool HasImpossibleSides(decimal side1, decimal side2, decimal side3)
53+
private static bool HasImpossibleSides(double side1, double side2, double side3)
3654
{
3755
return side1 < 0 || side2 < 0 || side3 < 0;
3856
}
3957

40-
private static bool ViolatesTriangleInequality(decimal side1, decimal side2, decimal side3)
58+
private static bool ViolatesTriangleInequality(double side1, double side2, double side3)
4159
{
4260
return side1 + side2 <= side3 || side1 + side3 <= side2 || side2 + side3 <= side1;
4361
}
4462

45-
private static int UniqueSides(decimal side1, decimal side2, decimal side3)
63+
private static int UniqueSides(double side1, double side2, double side3)
4664
{
47-
decimal[] sides = { side1, side2, side3 };
65+
double[] sides = { side1, side2, side3 };
4866
return sides.Distinct().Count();
4967
}
5068
}

exercises/triangle/Triangle.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,22 @@ public enum TriangleKind
99

1010
public static class Triangle
1111
{
12-
public static TriangleKind Kind(decimal side1, decimal side2, decimal side3)
12+
public static bool IsScalene(double side1, double side2, double side3)
13+
{
14+
throw new NotImplementedException("You need to implement this function.");
15+
}
16+
17+
public static bool IsIsosceles(double side1, double side2, double side3)
18+
{
19+
throw new NotImplementedException("You need to implement this function.");
20+
}
21+
22+
public static bool IsEquilateral(double side1, double side2, double side3)
23+
{
24+
throw new NotImplementedException("You need to implement this function.");
25+
}
26+
27+
private static TriangleKind Kind(double side1, double side2, double side3)
1328
{
1429
throw new NotImplementedException("You need to implement this function.");
1530
}

exercises/triangle/TriangleTest.cs

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,108 @@
1+
// This file was auto-generated based on version 1.0.0 of the canonical data.
2+
13
using Xunit;
24

35
public class TriangleTest
46
{
57
[Fact]
6-
public void Equilateral_triangles_have_equal_sides()
8+
public void Returns_true_if_the_triangle_is_equilateral_true_if_all_sides_are_equal()
9+
{
10+
Assert.True(Triangle.IsEquilateral(2,2,2));
11+
}
12+
13+
[Fact(Skip = "Remove to run test")]
14+
public void Returns_true_if_the_triangle_is_equilateral_false_if_any_side_is_unequal()
15+
{
16+
Assert.False(Triangle.IsEquilateral(2,3,2));
17+
}
18+
19+
[Fact(Skip = "Remove to run test")]
20+
public void Returns_true_if_the_triangle_is_equilateral_false_if_no_sides_are_equal()
721
{
8-
Assert.Equal(TriangleKind.Equilateral, Triangle.Kind(2, 2, 2));
22+
Assert.False(Triangle.IsEquilateral(5,4,6));
923
}
1024

1125
[Fact(Skip = "Remove to run test")]
12-
public void Larger_equilateral_triangles_also_have_equal_sides()
26+
public void Returns_true_if_the_triangle_is_equilateral_all_zero_sides_are_illegal_so_the_triangle_is_not_equilateral()
1327
{
14-
Assert.Equal(TriangleKind.Equilateral, Triangle.Kind(10, 10, 10));
28+
Assert.False(Triangle.IsEquilateral(0,0,0));
1529
}
1630

1731
[Fact(Skip = "Remove to run test")]
18-
public void Isosceles_triangles_have_last_two_sides_equal()
32+
public void Returns_true_if_the_triangle_is_equilateral_sides_may_be_floats()
1933
{
20-
Assert.Equal(TriangleKind.Isosceles, Triangle.Kind(3, 4, 4));
34+
Assert.True(Triangle.IsEquilateral(0.5,0.5,0.5));
2135
}
2236

2337
[Fact(Skip = "Remove to run test")]
24-
public void Isosceles_triangles_have_first_and_last_sides_equal()
38+
public void Returns_true_if_the_triangle_is_isosceles_true_if_last_two_sides_are_equal()
2539
{
26-
Assert.Equal(TriangleKind.Isosceles, Triangle.Kind(4, 3, 4));
40+
Assert.True(Triangle.IsIsosceles(3,4,4));
2741
}
2842

2943
[Fact(Skip = "Remove to run test")]
30-
public void Isosceles_triangles_have_two_first_sides_equal()
44+
public void Returns_true_if_the_triangle_is_isosceles_true_if_first_two_sides_are_equal()
3145
{
32-
Assert.Equal(TriangleKind.Isosceles, Triangle.Kind(4, 4, 3));
46+
Assert.True(Triangle.IsIsosceles(4,4,3));
3347
}
3448

3549
[Fact(Skip = "Remove to run test")]
36-
public void Isosceles_triangles_have_in_fact_exactly_two_sides_equal()
50+
public void Returns_true_if_the_triangle_is_isosceles_true_if_first_and_last_sides_are_equal()
3751
{
38-
Assert.Equal(TriangleKind.Isosceles, Triangle.Kind(10, 10, 2));
52+
Assert.True(Triangle.IsIsosceles(4,3,4));
3953
}
4054

4155
[Fact(Skip = "Remove to run test")]
42-
public void Scalene_triangles_have_no_equal_sides()
56+
public void Returns_true_if_the_triangle_is_isosceles_equilateral_triangles_are_also_isosceles()
4357
{
44-
Assert.Equal(TriangleKind.Scalene, Triangle.Kind(3, 4, 5));
58+
Assert.True(Triangle.IsIsosceles(4,4,4));
4559
}
4660

4761
[Fact(Skip = "Remove to run test")]
48-
public void Scalene_triangles_have_no_equal_sides_at_a_larger_scale_too()
62+
public void Returns_true_if_the_triangle_is_isosceles_false_if_no_sides_are_equal()
4963
{
50-
Assert.Equal(TriangleKind.Scalene, Triangle.Kind(10, 11, 12));
64+
Assert.False(Triangle.IsIsosceles(2,3,4));
5165
}
5266

5367
[Fact(Skip = "Remove to run test")]
54-
public void Scalene_triangles_have_no_equal_sides_in_descending_order_either()
68+
public void Returns_true_if_the_triangle_is_isosceles_sides_that_violate_triangle_inequality_are_not_isosceles_even_if_two_are_equal()
5569
{
56-
Assert.Equal(TriangleKind.Scalene, Triangle.Kind(5, 4, 2));
70+
Assert.False(Triangle.IsIsosceles(1,1,3));
5771
}
5872

5973
[Fact(Skip = "Remove to run test")]
60-
public void Very_small_triangles_are_legal()
74+
public void Returns_true_if_the_triangle_is_isosceles_sides_may_be_floats()
6175
{
62-
Assert.Equal(TriangleKind.Scalene, Triangle.Kind(0.4m, 0.6m, 0.3m));
76+
Assert.True(Triangle.IsIsosceles(0.5,0.4,0.5));
6377
}
6478

6579
[Fact(Skip = "Remove to run test")]
66-
public void Triangles_with_no_size_are_illegal()
80+
public void Returns_true_if_the_triangle_is_scalene_true_if_no_sides_are_equal()
6781
{
68-
Assert.Throws<TriangleException>(() => Triangle.Kind(0, 0, 0));
82+
Assert.True(Triangle.IsScalene(5,4,6));
6983
}
7084

7185
[Fact(Skip = "Remove to run test")]
72-
public void Triangles_with_negative_sides_are_illegal()
86+
public void Returns_true_if_the_triangle_is_scalene_false_if_all_sides_are_equal()
7387
{
74-
Assert.Throws<TriangleException>(() => Triangle.Kind(3, 4, -5));
88+
Assert.False(Triangle.IsScalene(4,4,4));
7589
}
7690

7791
[Fact(Skip = "Remove to run test")]
78-
public void Triangles_violating_triangle_inequality_are_illegal()
92+
public void Returns_true_if_the_triangle_is_scalene_false_if_two_sides_are_equal()
7993
{
80-
Assert.Throws<TriangleException>(() => Triangle.Kind(1, 1, 3));
94+
Assert.False(Triangle.IsScalene(4,4,3));
8195
}
8296

8397
[Fact(Skip = "Remove to run test")]
84-
public void Triangles_violating_triangle_inequality_are_illegal_2()
98+
public void Returns_true_if_the_triangle_is_scalene_sides_that_violate_triangle_inequality_are_not_scalene_even_if_they_are_all_different()
8599
{
86-
Assert.Throws<TriangleException>(() => Triangle.Kind(2, 4, 2));
100+
Assert.False(Triangle.IsScalene(7,3,2));
87101
}
88102

89103
[Fact(Skip = "Remove to run test")]
90-
public void Triangles_violating_triangle_inequality_are_illegal_3()
104+
public void Returns_true_if_the_triangle_is_scalene_sides_may_be_floats()
91105
{
92-
Assert.Throws<TriangleException>(() => Triangle.Kind(7, 3, 2));
106+
Assert.True(Triangle.IsScalene(0.5,0.4,0.6));
93107
}
94108
}

generators/Exercises/Triangle.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using Generators.Input;
4+
using Generators.Output;
5+
namespace Generators.Exercises
6+
{
7+
public class Triangle : Exercise
8+
{
9+
protected override void UpdateCanonicalData(CanonicalData canonicalData)
10+
{
11+
foreach (var data in canonicalData.Cases)
12+
{
13+
if (data.Property == "equilateral")
14+
data.Property = "IsEquilateral";
15+
else if (data.Property == "isosceles")
16+
data.Property = "IsIsosceles";
17+
else if (data.Property == "scalene")
18+
data.Property = "IsScalene";
19+
20+
data.Properties["sides"] = SplitArrayToValues(data.Properties["sides"]);
21+
data.SetInputParameters("sides");
22+
data.UseFullDescriptionPath = true;
23+
24+
}
25+
}
26+
27+
private UnescapedValue SplitArrayToValues(IEnumerable input)
28+
{
29+
const string template = "{% for item in {{input}} %}{{item}}{% if forloop.last == false %},{% endif %}{% endfor %}";
30+
31+
return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input }));
32+
}
33+
34+
35+
}
36+
}

0 commit comments

Comments
 (0)