Skip to content

Commit 70faced

Browse files
committed
improve tests
1 parent ca88c96 commit 70faced

15 files changed

+616
-430
lines changed

.github/workflows/dotnet.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ jobs:
2828
with:
2929
fetch-depth: 0
3030

31-
- name: Install .NET Core
31+
- name: Install .NET
3232
uses: actions/setup-dotnet@v3
3333
with:
34-
dotnet-version: 7.0.x
34+
dotnet-version: 8.0.x
3535

3636
- name: Restore Dependencies
3737
run: dotnet restore

src/AssemblyMetadata.Generators/AssemblyConstant.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
13
namespace AssemblyMetadata.Generators;
24

5+
[ExcludeFromCodeCoverage]
36
public class AssemblyConstant : IEquatable<AssemblyConstant>
47
{
58
public AssemblyConstant(string name, string value)
@@ -26,7 +29,7 @@ public bool Equals(AssemblyConstant other)
2629

2730
public override bool Equals(object value) => value is AssemblyConstant assemblyContant && Equals(assemblyContant);
2831

29-
public override int GetHashCode() => HashCode.Combine(Name, Value);
32+
public override int GetHashCode() => HashCode.Seed.Combine(Name).Combine(Value);
3033

3134
public static bool operator ==(AssemblyConstant left, AssemblyConstant right) => Equals(left, right);
3235

src/AssemblyMetadata.Generators/AssemblyMetadataGenerator.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,28 @@ private static GeneratorContext SemanticTransform(GeneratorAttributeSyntaxContex
8383
name = name.Substring(0, name.Length - 9);
8484

8585
var argument = attribute.ConstructorArguments.FirstOrDefault();
86-
var value = argument.Value as string;
86+
var value = argument.Value?.ToString() ?? string.Empty;
87+
88+
if (string.IsNullOrWhiteSpace(value))
89+
continue;
8790

8891
var constant = new AssemblyConstant(name, value);
8992
constants.Add(constant);
9093
}
9194
else if (name == nameof(AssemblyMetadataAttribute) && attribute.ConstructorArguments.Length == 2)
9295
{
9396
var nameArgument = attribute.ConstructorArguments[0];
94-
var key = nameArgument.Value as string;
97+
var key = nameArgument.Value?.ToString() ?? string.Empty;
9598

9699
var valueArgument = attribute.ConstructorArguments[1];
97-
var value = valueArgument.Value as string;
100+
var value = valueArgument.Value?.ToString() ?? string.Empty;
101+
102+
if (string.IsNullOrWhiteSpace(key) || string.IsNullOrWhiteSpace(value))
103+
continue;
104+
105+
// prevent duplicates
106+
if (constants.Any(c => c.Name == key))
107+
continue;
98108

99109
var constant = new AssemblyConstant(key, value);
100110
constants.Add(constant);

src/AssemblyMetadata.Generators/AssemblyMetadataWriter.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1+
using System.Reflection;
2+
13
namespace AssemblyMetadata.Generators;
24

35
public static class AssemblyMetadataWriter
46
{
7+
private static readonly Lazy<string> _informationVersion = new(() =>
8+
{
9+
var assembly = typeof(AssemblyMetadataWriter).Assembly;
10+
var attribute = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>();
11+
return attribute?.InformationalVersion ?? "1.0.0.0";
12+
});
13+
514
public static string Generate(EquatableArray<AssemblyConstant> constants)
615
{
716
if (constants == null)
@@ -18,10 +27,10 @@ public static string Generate(EquatableArray<AssemblyConstant> constants)
1827
.AppendLine("/// </summary>");
1928

2029
codeBuilder
21-
.Append("[global::System.CodeDom.Compiler.GeneratedCode(\"")
30+
.Append("[global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"")
2231
.Append("AssemblyMetadata.Generators")
2332
.Append("\", \"")
24-
.Append("1.0.0.0")
33+
.Append(_informationVersion.Value)
2534
.AppendLine("\")]");
2635

2736
codeBuilder
@@ -53,20 +62,20 @@ public static string Generate(EquatableArray<AssemblyConstant> constants)
5362
return codeBuilder.ToString();
5463
}
5564

56-
private static string SafeName(string name)
65+
public static string SafeName(string name)
5766
{
5867
return ToPropertyName(name.AsSpan());
5968
}
6069

61-
private static string SafeValue(string value)
70+
public static string SafeValue(string value)
6271
{
6372
return value
6473
.Replace("\\", "\\\\")
6574
.Replace("\"", "\\\"")
6675
.Replace(Environment.NewLine, "\\r\\n");
6776
}
6877

69-
private static string ToPropertyName(ReadOnlySpan<char> span)
78+
public static string ToPropertyName(ReadOnlySpan<char> span)
7079
{
7180
if (span.IsEmpty)
7281
return string.Empty;

src/AssemblyMetadata.Generators/EquatableArray.cs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using System.Collections;
2+
using System.Diagnostics.CodeAnalysis;
23

34
namespace AssemblyMetadata.Generators;
45

5-
public readonly struct EquatableArray<T> : IEquatable<EquatableArray<T>>, IEnumerable<T>
6+
[ExcludeFromCodeCoverage]
7+
public readonly struct EquatableArray<T> : IReadOnlyCollection<T>, IEquatable<EquatableArray<T>>
68
where T : IEquatable<T>
79
{
810
public static readonly EquatableArray<T> Empty = new(Array.Empty<T>());
@@ -14,7 +16,7 @@ public EquatableArray(T[] array)
1416
_array = array;
1517
}
1618

17-
public EquatableArray(IEnumerable<T> array)
19+
public EquatableArray(IEnumerable<T>? array)
1820
{
1921
array ??= Enumerable.Empty<T>();
2022
_array = array.ToArray();
@@ -35,12 +37,7 @@ public override int GetHashCode()
3537
if (_array is null)
3638
return 0;
3739

38-
HashCode hashCode = default;
39-
40-
foreach (T item in _array)
41-
hashCode.Add(item);
42-
43-
return hashCode.ToHashCode();
40+
return HashCode.Seed.CombineAll(_array);
4441
}
4542

4643
public ReadOnlySpan<T> AsSpan()
@@ -50,12 +47,14 @@ public ReadOnlySpan<T> AsSpan()
5047

5148
IEnumerator<T> IEnumerable<T>.GetEnumerator()
5249
{
53-
return ((IEnumerable<T>)(_array ?? Array.Empty<T>())).GetEnumerator();
50+
IEnumerable<T> array = _array ?? Array.Empty<T>();
51+
return array.GetEnumerator();
5452
}
5553

5654
IEnumerator IEnumerable.GetEnumerator()
5755
{
58-
return ((IEnumerable<T>)(_array ?? Array.Empty<T>())).GetEnumerator();
56+
IEnumerable<T> array = _array ?? Array.Empty<T>();
57+
return array.GetEnumerator();
5958
}
6059

6160
public int Count => _array?.Length ?? 0;

src/AssemblyMetadata.Generators/GeneratorContext.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
using Microsoft.CodeAnalysis;
1+
using System.Diagnostics.CodeAnalysis;
2+
3+
using Microsoft.CodeAnalysis;
24

35
namespace AssemblyMetadata.Generators;
46

7+
[ExcludeFromCodeCoverage]
58
public class GeneratorContext : IEquatable<GeneratorContext>
69
{
710
public GeneratorContext(IEnumerable<Diagnostic> diagnostics, IEnumerable<AssemblyConstant> constants)
@@ -28,7 +31,7 @@ public bool Equals(GeneratorContext other)
2831

2932
public override bool Equals(object value) => value is GeneratorContext context && Equals(context);
3033

31-
public override int GetHashCode() => HashCode.Combine(Diagnostics, Constants);
34+
public override int GetHashCode() => HashCode.Seed.CombineAll(Diagnostics).CombineAll(Constants);
3235

3336
public static bool operator ==(GeneratorContext left, GeneratorContext right) => Equals(left, right);
3437

0 commit comments

Comments
 (0)