forked from icsharpcode/CodeConverter
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOperatorMemberTests.cs
More file actions
221 lines (208 loc) · 6.47 KB
/
OperatorMemberTests.cs
File metadata and controls
221 lines (208 loc) · 6.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
using System.Threading.Tasks;
using ICSharpCode.CodeConverter.CSharp;
using ICSharpCode.CodeConverter.Tests.TestRunners;
using Xunit;
namespace ICSharpCode.CodeConverter.Tests.CSharp.MemberTests;
public class OperatorMemberTests : ConverterTestBase
{
[Fact]
public async Task TestNarrowingWideningConversionOperatorAsync()
{
await TestConversionVisualBasicToCSharpAsync(@"Public Class MyInt
Public Shared Narrowing Operator CType(i As Integer) As MyInt
Return New MyInt()
End Operator
Public Shared Widening Operator CType(myInt As MyInt) As Integer
Return 1
End Operator
End Class"
, @"
public partial class MyInt
{
public static explicit operator MyInt(int i)
{
return new MyInt();
}
public static implicit operator int(MyInt myInt)
{
return 1;
}
}");
}
[Fact]
public async Task OperatorOverloadsAsync()
{
// Note a couple map to the same thing in C# so occasionally the result won't compile. The user can manually decide what to do in such scenarios.
await TestConversionVisualBasicToCSharpAsync(@"Public Class AcmeClass
Public Shared Operator +(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator &(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator -(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator Not(ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator *(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator /(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator \(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator Mod(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator <<(ac As AcmeClass, i As Integer) As AcmeClass
Return ac
End Operator
Public Shared Operator >>(ac As AcmeClass, i As Integer) As AcmeClass
Return ac
End Operator
Public Shared Operator =(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator <>(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator <(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator >(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator <=(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator >=(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator And(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator Or(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
End Class", @"
public partial class AcmeClass
{
public static AcmeClass operator +(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator +(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator -(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator !(AcmeClass ac)
{
return ac;
}
public static AcmeClass operator *(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator /(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator /(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator %(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator <<(AcmeClass ac, int i)
{
return ac;
}
public static AcmeClass operator >>(AcmeClass ac, int i)
{
return ac;
}
public static AcmeClass operator ==(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator !=(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator <(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator >(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator <=(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator >=(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator &(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator |(string s, AcmeClass ac)
{
return ac;
}
}
1 target compilation errors:
CS0111: Type 'AcmeClass' already defines a member called 'op_Division' with the same parameter types");
}
[Fact]// The stack trace displayed will change from time to time. Feel free to update this characterization test appropriately.
public async Task OperatorOverloadsWithNoCSharpEquivalentShowErrorInlineCharacterizationAsync()
{
// No valid conversion to C# - to implement this you'd need to create a new method, and convert all callers to use it.
var convertedCode = await ConvertAsync<VBToCSConversion>(@"Public Class AcmeClass
Public Shared Operator ^(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator Like(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
End Class");
Assert.Contains("Cannot convert", convertedCode);
Assert.Contains("#error", convertedCode);
Assert.Contains("_failedMemberConversionMarker1", convertedCode);
Assert.Contains("Public Shared Operator ^(i As Integer,", convertedCode);
Assert.Contains("_failedMemberConversionMarker2", convertedCode);
Assert.Contains("Public Shared Operator Like(s As String,", convertedCode);
}
[Fact]
public async Task XorOperatorOverloadConversionAsync()
{
await TestConversionVisualBasicToCSharpAsync(
@"
Public Class MyType
Public Shared Operator Xor(left As MyType, right As MyType) As MyType
Throw New Global.System.NotSupportedException(""Not supported"")
End Operator
End Class",
@"using System;
public partial class MyType
{
public static MyType operator ^(MyType left, MyType right)
{
throw new NotSupportedException(""Not supported"");
}
}");
}
}