Skip to content

Commit 2190ba7

Browse files
committed
Fix parameterized test examples to simplify
1 parent 02c5100 commit 2190ba7

7 files changed

+265
-303
lines changed
+24-66
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,28 @@
1-
// Copyright (c) 2021 Koji Hasegawa.
1+
// Copyright (c) 2021-2025 Koji Hasegawa.
22
// This software is released under the MIT License.
33

44
using System;
55

66
namespace APIExamples
77
{
88
/// <summary>
9-
/// 元素的な属性
10-
/// このファイルは、BasicExamples/Scripts/Runtime/Entities/Enums/下にあるのもののコピーです
9+
/// 元素的な属性.
1110
/// </summary>
1211
/// <remarks>
13-
/// 当たり障りなさそうな陰陽五行とします。種類は未来永劫バージョンアップしても増えません(フラグ
12+
/// このenumは <c>BasicExample.Entities.Enums.Element</c> とは異なります(仕様を簡略化しました)
1413
/// </remarks>
1514
public enum Element
1615
{
1716
None,
18-
Wood,
1917
Fire,
2018
Water,
21-
Earth,
22-
Metal,
19+
Wood,
2320
}
2421

2522
public static class ElementExtensions
2623
{
2724
/// <summary>
28-
/// 属性名を返す
25+
/// 属性名を返す.
2926
/// </summary>
3027
/// <param name="self"></param>
3128
/// <returns></returns>
@@ -35,80 +32,41 @@ public static string GetName(this Element self)
3532
{
3633
case Element.None:
3734
return "無";
38-
case Element.Wood:
39-
return "木";
4035
case Element.Fire:
4136
return "火";
4237
case Element.Water:
4338
return "水";
44-
case Element.Earth:
45-
return "土";
46-
case Element.Metal:
47-
return "金";
39+
case Element.Wood:
40+
return "木";
4841
default:
4942
throw new ArgumentException($"Unknown Element: {self.ToString()}");
5043
}
5144
}
5245

5346
/// <summary>
54-
/// 属性攻撃を受けたときの被ダメージ倍率を返す
47+
/// 属性攻撃を受けたときの被ダメージ倍率を返す.
5548
/// </summary>
5649
/// <param name="self"></param>
57-
/// <param name="attack">攻撃の属性</param>
58-
/// <returns></returns>
50+
/// <param name="attack">攻撃側の属性</param>
51+
/// <returns>被ダメージ倍率</returns>
5952
public static float GetDamageMultiplier(this Element self, Element attack)
6053
{
61-
switch (self)
54+
if (self == Element.Wood && attack == Element.Fire)
6255
{
63-
case Element.Wood:
64-
switch (attack)
65-
{
66-
case Element.Fire:
67-
return 2.0f;
68-
case Element.Water:
69-
return 0.5f;
70-
default:
71-
return 1.0f;
72-
}
73-
case Element.Fire:
74-
switch (attack)
75-
{
76-
case Element.Water:
77-
return 2.0f;
78-
case Element.Wood:
79-
return 0.5f;
80-
default:
81-
return 1.0f;
82-
}
83-
case Element.Water:
84-
switch (attack)
85-
{
86-
case Element.Wood:
87-
return 2.0f;
88-
case Element.Fire:
89-
return 0.5f;
90-
default:
91-
return 1.0f;
92-
}
93-
case Element.Earth:
94-
switch (attack)
95-
{
96-
case Element.Metal:
97-
return 2.0f;
98-
default:
99-
return 0.5f;
100-
}
101-
case Element.Metal:
102-
switch (attack)
103-
{
104-
case Element.Earth:
105-
return 2.0f;
106-
default:
107-
return 0.5f;
108-
}
109-
default:
110-
return 1.0f;
56+
return 2.0f;
57+
}
58+
59+
if (self == Element.Fire && attack == Element.Water)
60+
{
61+
return 2.0f;
11162
}
63+
64+
if (self == Element.Water && attack == Element.Wood)
65+
{
66+
return 2.0f;
67+
}
68+
69+
return 1.0f;
11270
}
11371
}
11472
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
// Copyright (c) 2021-2023 Koji Hasegawa.
1+
// Copyright (c) 2021-2025 Koji Hasegawa.
22
// This software is released under the MIT License.
33

4+
using System.Collections;
45
using System.Threading.Tasks;
56
using NUnit.Framework;
67
using UnityEngine.TestTools;
@@ -10,71 +11,78 @@
1011
namespace APIExamples.NUnit
1112
{
1213
/// <summary>
13-
/// <see cref="PairwiseAttribute"/>によって<see cref="ValuesAttribute"/>および<see cref="ValuesAttribute"/>の組み合わせを絞り込む例。
14+
/// <see cref="PairwiseAttribute"/> によって <see cref="ValuesAttribute"/> および <see cref="ValuesAttribute"/> の組み合わせを絞り込むパラメタライズドテストの記述例.
15+
/// <p/>
16+
/// 全網羅のサンプルは <see cref="ValuesAttributeExample"/> および <see cref="ValueSourceAttributeExample"/> を参照してください。
17+
/// 組み合わせを固定する <see cref="SequentialAttribute"/> のサンプルは <see cref="SequentialAttributeExample"/> を参照してください。
1418
/// </summary>
1519
/// <remarks>
16-
/// <see cref="UnityTestAttribute"/>と同時に使用すると正しい組み合わせが得られません(むしろ増える)
20+
/// <see cref="UnityTestAttribute"/> と同時に使用すると正しい組み合わせが得られません(むしろ増える)
1721
/// </remarks>
1822
[TestFixture]
1923
public class PairwiseAttributeExample
2024
{
2125
[Test]
2226
[Pairwise]
23-
public void Values属性の組み合わせを絞り込み可能( // 全網羅では6*6*3*2=216通りのところ、ペアワイズ法によって36通りになる例
24-
[Values] Element defence,
25-
[Values] Element attack,
26-
[Values(1, 2, 3)] int intArgument,
27-
[Values] bool boolArgument)
27+
public void Values属性の組み合わせをペアワイズ法で絞り込む例(
28+
[Values] Element defence,
29+
[Values] Element attack,
30+
[Values(1, 2, 3)] int intArgument,
31+
[Values] bool boolArgument)
32+
// Note: 全網羅では 4*4*3*2=96 通りのところ、ペアワイズ法によって 16 通りになります
2833
{
2934
var actual = defence.GetDamageMultiplier(attack);
3035

31-
Assert.That(actual, Is.GreaterThanOrEqualTo(0.5f).And.LessThanOrEqualTo(2.0f));
36+
Assert.That(actual, Is.GreaterThanOrEqualTo(1.0f).And.LessThanOrEqualTo(2.0f));
3237
}
3338

39+
// テストケースの引数が取る値を静的フィールドで定義
40+
private static Element[] s_elements = { Element.None, Element.Fire, Element.Water, Element.Wood };
41+
private static int[] s_intValues = { 1, 2, 3 };
42+
private static bool[] s_boolValues = { false, true };
43+
3444
[Test]
3545
[Pairwise]
36-
public async Task Values属性の組み合わせを絞り込み可能_AsyncTest( // 全網羅では6*6*3*2=216通りのところ、ペアワイズ法によって36通りになる例
37-
[Values] Element defence,
38-
[Values] Element attack,
39-
[Values(1, 2, 3)] int intArgument,
40-
[Values] bool boolArgument)
46+
public void ValueSource属性の組み合わせをペアワイズ法で絞り込む例(
47+
[ValueSource(nameof(s_elements))] Element defence,
48+
[ValueSource(nameof(s_elements))] Element attack,
49+
[ValueSource(nameof(s_intValues))] int intArgument,
50+
[ValueSource(nameof(s_boolValues))] bool boolArgument)
51+
// Note: 全網羅では 4*4*3*2=96 通りのところ、ペアワイズ法によって 16 通りになります
4152
{
4253
var actual = defence.GetDamageMultiplier(attack);
43-
await Task.Delay(0);
4454

45-
Assert.That(actual, Is.GreaterThanOrEqualTo(0.5f).And.LessThanOrEqualTo(2.0f));
55+
Assert.That(actual, Is.GreaterThanOrEqualTo(1.0f).And.LessThanOrEqualTo(2.0f));
4656
}
4757

48-
private static Element[] s_defence1X = { Element.Wood, Element.Fire, Element.Water };
49-
private static Element[] s_attack1X = { Element.None, Element.Earth, Element.Metal };
50-
private static int[] s_intValues = { 1, 2, 3 };
51-
private static bool[] s_boolValues = { false, true };
52-
53-
[Test]
58+
[Explicit("UnityTest では Pairwise 属性は正しい組み合わせを生成しません")]
59+
[UnityTest]
5460
[Pairwise]
55-
public void ValueSource属性の組み合わせも絞り込み可能( // 全網羅では3*3*3*2=54通りのところ、ペアワイズ法によって10通りになる例
56-
[ValueSource(nameof(s_defence1X))] Element defence,
57-
[ValueSource(nameof(s_attack1X))] Element attack,
58-
[ValueSource(nameof(s_intValues))] int intArgument,
59-
[ValueSource(nameof(s_boolValues))] bool boolArgument)
61+
public IEnumerator UnityTestではPairwise属性は正しい組み合わせを生成しない(
62+
[Values] Element defence,
63+
[Values] Element attack,
64+
[Values(1, 2, 3)] int intArgument,
65+
[Values] bool boolArgument)
6066
{
6167
var actual = defence.GetDamageMultiplier(attack);
68+
yield return null;
6269

63-
Assert.That(actual, Is.GreaterThanOrEqualTo(0.5f).And.LessThanOrEqualTo(2.0f));
70+
Assert.That(actual, Is.GreaterThanOrEqualTo(1.0f).And.LessThanOrEqualTo(2.0f));
6471
}
6572

6673
[Test]
6774
[Pairwise]
68-
public async Task ValueSource属性の組み合わせも絞り込み可能_AsyncTest( // 全網羅では3*3*3*2=54通りのところ、ペアワイズ法によって10通りになる例
69-
[ValueSource(nameof(s_defence1X))] Element defence,
70-
[ValueSource(nameof(s_attack1X))] Element attack,
71-
[ValueSource(nameof(s_intValues))] int intArgument,
72-
[ValueSource(nameof(s_boolValues))] bool boolArgument)
75+
public async Task 非同期テストでもPairwise属性は使用可能(
76+
[Values] Element defence,
77+
[Values] Element attack,
78+
[Values(1, 2, 3)] int intArgument,
79+
[Values] bool boolArgument)
80+
// Note: 全網羅では 4*4*3*2=96 通りのところ、ペアワイズ法によって 16 通りになります
7381
{
7482
var actual = defence.GetDamageMultiplier(attack);
75-
await Task.Delay(0);
83+
await Task.Yield();
7684

77-
Assert.That(actual, Is.GreaterThanOrEqualTo(0.5f).And.LessThanOrEqualTo(2.0f));
85+
Assert.That(actual, Is.GreaterThanOrEqualTo(1.0f).And.LessThanOrEqualTo(2.0f));
7886
}
7987
}
8088
}
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,85 @@
1-
// Copyright (c) 2021-2023 Koji Hasegawa.
1+
// Copyright (c) 2021-2025 Koji Hasegawa.
22
// This software is released under the MIT License.
33

44
// ReSharper disable AccessToStaticMemberViaDerivedType
55

6+
using System.Collections;
67
using System.Threading.Tasks;
78
using NUnit.Framework;
89
using UnityEngine.TestTools;
910

1011
namespace APIExamples.NUnit
1112
{
1213
/// <summary>
13-
/// <see cref="SequentialAttribute"/>によって<see cref="ValuesAttribute"/>および<see cref="ValuesAttribute"/>の組み合わせを固定する例。
14+
/// <see cref="SequentialAttribute"/> によって <see cref="ValuesAttribute"/> および <see cref="ValuesAttribute"/> の組み合わせを固定するパラメタライズドテストの記述例.
15+
/// <p/>
16+
/// 全網羅のサンプルは <see cref="ValuesAttributeExample"/> および <see cref="ValueSourceAttributeExample"/> を参照してください。
17+
/// 組み合わせを絞り込む <see cref="PairwiseAttribute"/> のサンプルは <see cref="PairwiseAttributeExample"/> を参照してください。
1418
/// </summary>
1519
/// <remarks>
16-
/// <see cref="UnityTestAttribute"/>と同時に使用すると正しい組み合わせが得られません(むしろ増える)
20+
/// <see cref="UnityTestAttribute"/> と同時に使用すると正しい組み合わせが得られません(むしろ増える)
1721
/// </remarks>
1822
[TestFixture]
1923
public class SequentialAttributeExample
2024
{
2125
[Test]
2226
[Sequential]
23-
public void Values属性の組み合わせを固定可能( // 全網羅では4*4*4=64通りのところ、4通りになる例
24-
[Values(Element.Earth, Element.Earth, Element.Metal, Element.Metal)]
25-
Element defence,
26-
[Values(Element.Metal, Element.None, Element.Earth, Element.None)]
27-
Element attack,
28-
[Values(2.0f, 0.5f, 2.0f, 0.5f)] float expected)
27+
public void Sequential属性によってValues属性の組み合わせを固定(
28+
[Values(Element.Fire, Element.Water, Element.Wood)]
29+
Element defence,
30+
[Values(Element.Water, Element.Wood, Element.Fire)]
31+
Element attack)
32+
// Note: 組み合わせが固定され、3件のテストケースになります
2933
{
3034
var actual = defence.GetDamageMultiplier(attack);
3135

32-
Assert.That(actual, Is.EqualTo(expected));
36+
Assert.That(actual, Is.EqualTo(2.0f));
3337
}
3438

39+
// テストケースの引数が取る値を静的フィールドで定義
40+
private static Element[] s_defences = { Element.Fire, Element.Water, Element.Wood };
41+
private static Element[] s_attacks = { Element.Water, Element.Wood, Element.Fire };
42+
3543
[Test]
3644
[Sequential]
37-
public async Task Values属性の組み合わせを固定可能_AsyncTest( // 全網羅では4*4*4=64通りのところ、4通りになる例
38-
[Values(Element.Earth, Element.Earth, Element.Metal, Element.Metal)]
39-
Element defence,
40-
[Values(Element.Metal, Element.None, Element.Earth, Element.None)]
41-
Element attack,
42-
[Values(2.0f, 0.5f, 2.0f, 0.5f)] float expected)
45+
public void Sequential属性によってValueSource属性の組み合わせを固定(
46+
[ValueSource(nameof(s_defences))] Element defence,
47+
[ValueSource(nameof(s_attacks))] Element attack)
48+
// Note: 組み合わせが固定され、3件のテストケースになります
4349
{
4450
var actual = defence.GetDamageMultiplier(attack);
45-
await Task.Delay(0);
4651

47-
Assert.That(actual, Is.EqualTo(expected));
52+
Assert.That(actual, Is.EqualTo(2.0f));
4853
}
4954

50-
private static Element[] s_defenceSeq = { Element.Earth, Element.Earth, Element.Metal, Element.Metal };
51-
private static Element[] s_attackSeq = { Element.Metal, Element.None, Element.Earth, Element.None };
52-
private static float[] s_expected = { 2.0f, 0.5f, 2.0f, 0.5f };
53-
54-
[Test]
55+
[Explicit("UnityTest では Sequential 属性は正しい組み合わせを生成しません")]
56+
[UnityTest]
5557
[Sequential]
56-
public void ValueSource属性の組み合わせも固定可能( // 全網羅では4*4*4=64通りのところ、4通りになる例
57-
[ValueSource(nameof(s_defenceSeq))] Element defence,
58-
[ValueSource(nameof(s_attackSeq))] Element attack,
59-
[ValueSource(nameof(s_expected))] float expected)
58+
public IEnumerator UnityTestではSequential属性は正しい組み合わせを生成しない(
59+
[Values(Element.Fire, Element.Water, Element.Wood)]
60+
Element defence,
61+
[Values(Element.Water, Element.Wood, Element.Fire)]
62+
Element attack)
6063
{
6164
var actual = defence.GetDamageMultiplier(attack);
65+
yield return null;
6266

63-
Assert.That(actual, Is.EqualTo(expected));
67+
Assert.That(actual, Is.EqualTo(2.0f));
6468
}
6569

6670
[Test]
6771
[Sequential]
68-
public async Task ValueSource属性の組み合わせも固定可能_AsyncTest( // 全網羅では4*4*4=64通りのところ、4通りになる例
69-
[ValueSource(nameof(s_defenceSeq))] Element defence,
70-
[ValueSource(nameof(s_attackSeq))] Element attack,
71-
[ValueSource(nameof(s_expected))] float expected)
72+
public async Task 非同期テストでもSequential属性は使用可能(
73+
[Values(Element.Fire, Element.Water, Element.Wood)]
74+
Element defence,
75+
[Values(Element.Water, Element.Wood, Element.Fire)]
76+
Element attack)
77+
// Note: 組み合わせが固定され、3件のテストケースになります
7278
{
7379
var actual = defence.GetDamageMultiplier(attack);
74-
await Task.Delay(0);
80+
await Task.Yield();
7581

76-
Assert.That(actual, Is.EqualTo(expected));
82+
Assert.That(actual, Is.EqualTo(2.0f));
7783
}
7884
}
7985
}

0 commit comments

Comments
 (0)