Skip to content

Commit e8cb366

Browse files
committed
add sample generator
1 parent 796ce43 commit e8cb366

20 files changed

Lines changed: 3650 additions & 0 deletions

tools/azsdk-cli/Azure.Sdk.Tools.Cli.Tests/Helpers/FileHelperTests.cs

Lines changed: 504 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System.Text;
5+
using Azure.Sdk.Tools.Cli.SampleGeneration.Languages;
6+
7+
namespace Azure.Sdk.Tools.Cli.Tests.SampleGeneration;
8+
9+
public class DotNetSourceInputProviderTests
10+
{
11+
private static string CreateTempPackage(out string srcDir, out string testsDir)
12+
{
13+
string root = Path.Combine(Path.GetTempPath(), "azsdk-test-" + Guid.NewGuid().ToString("N"));
14+
Directory.CreateDirectory(root);
15+
srcDir = Path.Combine(root, "src");
16+
testsDir = Path.Combine(root, "tests");
17+
Directory.CreateDirectory(srcDir);
18+
Directory.CreateDirectory(testsDir);
19+
return root;
20+
}
21+
22+
private static string WriteFile(string dir, string name, string content)
23+
{
24+
var path = Path.Combine(dir, name);
25+
File.WriteAllText(path, content, Encoding.UTF8);
26+
return path;
27+
}
28+
29+
[Test]
30+
public void Includes_Infrastructure_Base_Class_No_Test_Methods()
31+
{
32+
var provider = new DotNetSourceInputProvider();
33+
var root = CreateTempPackage(out var src, out var tests);
34+
35+
WriteFile(src, "Client.cs", "public class Client { }");
36+
WriteFile(tests, "KeysTestBase.cs", @"using NUnit.Framework; public abstract class KeysTestBase { [SetUp] public void Setup(){} }");
37+
38+
var inputs = provider.Create(root);
39+
40+
Assert.Multiple(() =>
41+
{
42+
// Expect: src folder and KeysTestBase.cs represented (as individual file input), no test methods so it's infra.
43+
Assert.That(inputs.Any(i => i.Path == src), "src directory should be included");
44+
Assert.That(inputs.Any(i => i.Path.EndsWith("KeysTestBase.cs")), "KeysTestBase.cs should be included as infra");
45+
});
46+
47+
}
48+
49+
[Test]
50+
public void Excludes_File_With_Test_Method()
51+
{
52+
var provider = new DotNetSourceInputProvider();
53+
var root = CreateTempPackage(out var src, out var tests);
54+
55+
WriteFile(src, "Client.cs", "public class Client { }");
56+
WriteFile(tests, "KeyClientTests.cs", @"using NUnit.Framework; public class KeyClientTests { [Test] public void TestA(){} }");
57+
58+
var inputs = provider.Create(root);
59+
60+
Assert.That(!inputs.Any(i => i.Path.EndsWith("KeyClientTests.cs")), "Test file with [Test] should be excluded");
61+
}
62+
63+
[Test]
64+
public void Includes_File_With_Lifecycle_Only()
65+
{
66+
var provider = new DotNetSourceInputProvider();
67+
var root = CreateTempPackage(out var src, out var tests);
68+
69+
WriteFile(src, "Client.cs", "public class Client { }");
70+
WriteFile(tests, "Fixture.cs", @"using NUnit.Framework; public class Fixture { [OneTimeSetUp] public void Init(){} }");
71+
72+
var inputs = provider.Create(root);
73+
74+
Assert.That(inputs.Any(i => i.Path.EndsWith("Fixture.cs")), "File with only lifecycle attributes should be treated as infra");
75+
}
76+
77+
[Test]
78+
public void Excludes_File_With_TestCase_Method()
79+
{
80+
var provider = new DotNetSourceInputProvider();
81+
var root = CreateTempPackage(out var src, out var tests);
82+
83+
WriteFile(src, "Client.cs", "public class Client { }");
84+
WriteFile(tests, "SomethingTests.cs", @"using NUnit.Framework; public class SomethingTests { [TestCase(1)] public void TestA(int x){} }");
85+
86+
var inputs = provider.Create(root);
87+
Assert.That(!inputs.Any(i => i.Path.EndsWith("SomethingTests.cs")), "File containing [TestCase] should be excluded");
88+
}
89+
90+
[Test]
91+
public void Includes_Abstract_Base_With_Inheritance_Of_RecordedTestBase()
92+
{
93+
var provider = new DotNetSourceInputProvider();
94+
var root = CreateTempPackage(out var src, out var tests);
95+
96+
WriteFile(src, "Client.cs", "public class Client { }");
97+
WriteFile(tests, "CustomTestBase.cs", @"public abstract class CustomTestBase : RecordedTestBase<object> { protected void Helper(){} }");
98+
99+
var inputs = provider.Create(root);
100+
Assert.That(inputs.Any(i => i.Path.EndsWith("CustomTestBase.cs")), "Abstract base inheriting RecordedTestBase should be included");
101+
}
102+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using Azure.Sdk.Tools.Cli.SampleGeneration.Languages;
5+
6+
namespace Azure.Sdk.Tools.Cli.Tests.SampleGeneration;
7+
8+
public class GoSourceInputProviderTests
9+
{
10+
[Test]
11+
public void Create_Returns_Single_Input_With_Go_Extension()
12+
{
13+
var provider = new GoSourceInputProvider();
14+
var packagePath = Path.Combine(Path.GetTempPath(), "azsdk-go-test-" + Guid.NewGuid().ToString("N"));
15+
Directory.CreateDirectory(packagePath);
16+
17+
var inputs = provider.Create(packagePath);
18+
19+
Assert.Multiple(() =>
20+
{
21+
Assert.That(inputs, Has.Count.EqualTo(1), "Should return exactly one source input");
22+
Assert.That(inputs[0].Path, Is.EqualTo(packagePath), "Path should match the provided package path");
23+
Assert.That(inputs[0].IncludeExtensions, Is.Not.Null, "IncludeExtensions should be set");
24+
Assert.That(inputs[0].IncludeExtensions, Does.Contain(".go"), "Should include .go extension filter");
25+
});
26+
}
27+
28+
[Test]
29+
public void Create_Does_Not_Require_Existing_Path()
30+
{
31+
var provider = new GoSourceInputProvider();
32+
var nonExistentPath = Path.Combine(Path.GetTempPath(), "azsdk-go-missing-" + Guid.NewGuid().ToString("N"));
33+
// Intentionally do NOT create the directory
34+
35+
var inputs = provider.Create(nonExistentPath);
36+
37+
Assert.Multiple(() =>
38+
{
39+
Assert.That(inputs, Has.Count.EqualTo(1), "Should still return a single input even if directory doesn't exist");
40+
Assert.That(inputs[0].Path, Is.EqualTo(nonExistentPath), "Path should be the provided (possibly non-existent) path");
41+
Assert.That(inputs[0].IncludeExtensions, Does.Contain(".go"), "Should include .go extension");
42+
});
43+
}
44+
45+
[Test]
46+
public void Create_Returns_New_List_Instance_On_Each_Call()
47+
{
48+
var provider = new GoSourceInputProvider();
49+
var path1 = Path.Combine(Path.GetTempPath(), "azsdk-go-test1-" + Guid.NewGuid().ToString("N"));
50+
var path2 = Path.Combine(Path.GetTempPath(), "azsdk-go-test2-" + Guid.NewGuid().ToString("N"));
51+
Directory.CreateDirectory(path1);
52+
Directory.CreateDirectory(path2);
53+
54+
var first = provider.Create(path1);
55+
var second = provider.Create(path2);
56+
57+
Assert.Multiple(() =>
58+
{
59+
Assert.That(first[0].Path, Is.EqualTo(path1));
60+
Assert.That(second[0].Path, Is.EqualTo(path2));
61+
Assert.That(!ReferenceEquals(first, second), "Each call should return a new list instance");
62+
});
63+
}
64+
}
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using Azure.Sdk.Tools.Cli.SampleGeneration.Languages;
5+
6+
namespace Azure.Sdk.Tools.Cli.Tests.SampleGeneration;
7+
8+
public class JavaSourceInputProviderTests
9+
{
10+
private static string CreateTempPackage()
11+
{
12+
string root = Path.Combine(Path.GetTempPath(), "azsdk-java-test-" + Guid.NewGuid().ToString("N"));
13+
Directory.CreateDirectory(root);
14+
return root;
15+
}
16+
17+
private static void WriteFile(string dir, string name, string content)
18+
{
19+
var path = Path.Combine(dir, name);
20+
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
21+
File.WriteAllText(path, content);
22+
}
23+
24+
[Test]
25+
public void Includes_Src_Directory_When_Present()
26+
{
27+
var provider = new JavaSourceInputProvider();
28+
var root = CreateTempPackage();
29+
var srcDir = Path.Combine(root, "src");
30+
Directory.CreateDirectory(srcDir);
31+
WriteFile(srcDir, "Client.java", "class Client {}");
32+
33+
var inputs = provider.Create(root);
34+
35+
Assert.Multiple(() =>
36+
{
37+
Assert.That(inputs.Count, Is.EqualTo(1), "Should have exactly one input when only src directory exists");
38+
Assert.That(inputs[0].Path, Is.EqualTo(srcDir), "Should include src directory");
39+
Assert.That(inputs[0].IncludeExtensions, Is.Not.Null, "Should have include extensions specified");
40+
Assert.That(inputs[0].IncludeExtensions, Does.Contain(".java"), "Should include .java files");
41+
});
42+
}
43+
44+
[Test]
45+
public void Throws_When_Src_Directory_Missing()
46+
{
47+
var provider = new JavaSourceInputProvider();
48+
var root = CreateTempPackage();
49+
50+
var ex = Assert.Throws<ArgumentException>(() => provider.Create(root));
51+
Assert.Multiple(() =>
52+
{
53+
Assert.That(ex!.Message, Does.Contain("src"), "Error message should mention src directory");
54+
Assert.That(ex.Message, Does.Contain(root), "Error message should include the provided path");
55+
Assert.That(ex.ParamName, Is.EqualTo("packagePath"), "Should specify packagePath as the problem parameter");
56+
});
57+
}
58+
59+
[Test]
60+
public void Includes_Samples_Directory_When_Present()
61+
{
62+
var provider = new JavaSourceInputProvider();
63+
var root = CreateTempPackage();
64+
var srcDir = Path.Combine(root, "src");
65+
var samplesDir = Path.Combine(root, "samples");
66+
Directory.CreateDirectory(srcDir);
67+
Directory.CreateDirectory(samplesDir);
68+
WriteFile(srcDir, "Client.java", "class Client {}");
69+
WriteFile(samplesDir, "Sample1.java", "class Sample1 {}");
70+
71+
var inputs = provider.Create(root);
72+
73+
Assert.Multiple(() =>
74+
{
75+
Assert.That(inputs, Has.Count.EqualTo(2), "Should include both src and samples directories");
76+
Assert.That(inputs.Any(i => i.Path == srcDir), "Should include src directory");
77+
Assert.That(inputs.Any(i => i.Path == samplesDir), "Should include samples directory");
78+
var samplesInput = inputs.First(i => i.Path == samplesDir);
79+
Assert.That(samplesInput.IncludeExtensions, Does.Contain(".java"), "Samples directory should include .java files");
80+
});
81+
}
82+
83+
[Test]
84+
public void Works_Without_Samples_Directory()
85+
{
86+
var provider = new JavaSourceInputProvider();
87+
var root = CreateTempPackage();
88+
var srcDir = Path.Combine(root, "src");
89+
Directory.CreateDirectory(srcDir);
90+
WriteFile(srcDir, "Client.java", "class Client {}");
91+
92+
var inputs = provider.Create(root);
93+
94+
Assert.Multiple(() =>
95+
{
96+
Assert.That(inputs.Count, Is.EqualTo(1), "Should work without samples directory");
97+
Assert.That(inputs[0].Path, Is.EqualTo(srcDir), "Should still include src directory");
98+
});
99+
}
100+
101+
[Test]
102+
public void Includes_Test_Resources_Files_From_Parent_Directory()
103+
{
104+
var provider = new JavaSourceInputProvider();
105+
var tempRoot = Path.GetTempPath();
106+
var parentDir = Path.Combine(tempRoot, "azsdk-java-parent-" + Guid.NewGuid().ToString("N"));
107+
var packageDir = Path.Combine(parentDir, "package");
108+
Directory.CreateDirectory(packageDir);
109+
110+
var srcDir = Path.Combine(packageDir, "src");
111+
Directory.CreateDirectory(srcDir);
112+
WriteFile(srcDir, "Client.java", "class Client {}");
113+
114+
var testResourcesFile1 = Path.Combine(parentDir, "test-resources.json");
115+
var testResourcesFile2 = Path.Combine(parentDir, "test-resources-post.ps1");
116+
File.WriteAllText(testResourcesFile1, "{}");
117+
File.WriteAllText(testResourcesFile2, "{}");
118+
119+
var inputs = provider.Create(packageDir);
120+
121+
Assert.Multiple(() =>
122+
{
123+
Assert.That(inputs, Has.Count.EqualTo(3), "Should include src dir + 2 test-resources files");
124+
Assert.That(inputs.Any(i => i.Path == srcDir), "Should include src directory");
125+
Assert.That(inputs.Any(i => i.Path == testResourcesFile1), "Should include test-resources.json");
126+
Assert.That(inputs.Any(i => i.Path == testResourcesFile2), "Should include test-resources-post.ps1");
127+
});
128+
}
129+
130+
[Test]
131+
public void Works_Without_Test_Resources_Files()
132+
{
133+
var provider = new JavaSourceInputProvider();
134+
var root = CreateTempPackage();
135+
var srcDir = Path.Combine(root, "src");
136+
Directory.CreateDirectory(srcDir);
137+
WriteFile(srcDir, "Client.java", "class Client {}");
138+
139+
var inputs = provider.Create(root);
140+
141+
Assert.Multiple(() =>
142+
{
143+
Assert.That(inputs.Count, Is.EqualTo(1), "Should work without test-resources files");
144+
Assert.That(inputs[0].Path, Is.EqualTo(srcDir), "Should still include src directory");
145+
});
146+
}
147+
148+
[Test]
149+
public void Includes_All_Components_When_Everything_Present()
150+
{
151+
var provider = new JavaSourceInputProvider();
152+
var tempRoot = Path.GetTempPath();
153+
var parentDir = Path.Combine(tempRoot, "azsdk-java-full-" + Guid.NewGuid().ToString("N"));
154+
var packageDir = Path.Combine(parentDir, "package");
155+
Directory.CreateDirectory(packageDir);
156+
157+
var srcDir = Path.Combine(packageDir, "src");
158+
Directory.CreateDirectory(srcDir);
159+
WriteFile(srcDir, "Client.java", "class Client {}");
160+
WriteFile(srcDir, "Model.java", "class Model {}");
161+
162+
var samplesDir = Path.Combine(packageDir, "samples");
163+
Directory.CreateDirectory(samplesDir);
164+
WriteFile(samplesDir, "Sample1.java", "class Sample1 {}");
165+
WriteFile(samplesDir, "Sample2.java", "class Sample2 {}");
166+
167+
var testResourcesFile = Path.Combine(parentDir, "test-resources.json");
168+
File.WriteAllText(testResourcesFile, "{}");
169+
170+
var inputs = provider.Create(packageDir);
171+
172+
Assert.Multiple(() =>
173+
{
174+
Assert.That(inputs, Has.Count.EqualTo(3), "Should include src dir + samples dir + test-resources file");
175+
Assert.That(inputs.Any(i => i.Path == srcDir), "Should include src directory");
176+
Assert.That(inputs.Any(i => i.Path == samplesDir), "Should include samples directory");
177+
Assert.That(inputs.Any(i => i.Path == testResourcesFile), "Should include test-resources file");
178+
179+
var directoryInputs = inputs.Where(i => Directory.Exists(i.Path));
180+
Assert.That(directoryInputs.All(i => i.IncludeExtensions != null && i.IncludeExtensions.Contains(".java")),
181+
"All directory inputs should include .java files");
182+
});
183+
}
184+
}

0 commit comments

Comments
 (0)