Skip to content

Commit 14eb33b

Browse files
committed
Removed unused extensibility features.
1 parent 32f4174 commit 14eb33b

9 files changed

Lines changed: 93 additions & 99 deletions

File tree

SqlServerSimulator.Tests/QualityTests.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,30 @@ public class QualityTests
99
[Description("Prevents unintentional expansion of the public API.")]
1010
public void PublicApiWhitelist()
1111
{
12-
var types = typeof(Simulation)
12+
var simulation = typeof(Simulation);
13+
14+
var types = simulation
1315
.Assembly
1416
.GetTypes()
1517
.Where(type => type.IsPublic)
1618
.ToArray();
1719

1820
Assert.AreEqual(1, types.Length);
21+
Assert.AreEqual(simulation, types[0]);
22+
23+
var members = simulation
24+
.GetMembers()
25+
.Where(member => member.DeclaringType == simulation)
26+
.ToArray();
27+
28+
Assert.AreEqual(2, members.Length);
29+
30+
HashSet<string> allowedMemberNames = [
31+
".ctor",
32+
nameof(Simulation.CreateDbConnection),
33+
];
34+
35+
foreach (var member in members)
36+
Assert.Contains(member.Name, allowedMemberNames);
1937
}
2038
}

SqlServerSimulator.Tests/SelectTests.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,8 @@ public void Select1ViaExecuteReaderIndexer()
2525
public void Select1ViaExecuteReaderGetInt32()
2626
=> Assert.AreEqual(1, ScalarViaReaderTest("select 1").GetInt32(0));
2727

28-
private static void VersionTest(string commandText)
29-
{
30-
var simulation = new Simulation();
31-
var version = simulation.Version;
32-
Assert.IsNotNull(version);
33-
34-
Assert.AreEqual(version, simulation.ExecuteScalar(commandText));
35-
}
28+
private static void VersionTest(string commandText) =>
29+
Assert.AreEqual("SQL Server Simulator", new Simulation().ExecuteScalar(commandText));
3630

3731
[TestMethod]
3832
public void SelectVersion() => VersionTest("SELECT @@VERSION");

SqlServerSimulator/Extensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ public static bool TryMoveNext<T>(this IEnumerator<T> enumerator, [NotNullWhen(t
1212
return moved;
1313
}
1414

15-
public static Parser.Token RequireNext(this IEnumerator<Parser.Token> enumerator, Simulation simulation)
15+
public static Parser.Token RequireNext(this IEnumerator<Parser.Token> enumerator)
1616
{
1717
Debug.Assert(enumerator.Current is not null);
1818
var previous = enumerator.Current!;
19-
return enumerator.MoveNext() ? enumerator.Current : throw simulation.SyntaxErrorNear(previous);
19+
return enumerator.MoveNext() ? enumerator.Current : throw SimulatedSqlException.SyntaxErrorNear(previous);
2020
}
2121

22-
public static T RequireNext<T>(this IEnumerator<Parser.Token> enumerator, Simulation simulation)
22+
public static T RequireNext<T>(this IEnumerator<Parser.Token> enumerator)
2323
where T : Parser.Token
2424
{
2525
Debug.Assert(enumerator.Current is not null);
@@ -32,6 +32,6 @@ public static T RequireNext<T>(this IEnumerator<Parser.Token> enumerator, Simula
3232
return current;
3333
}
3434

35-
throw simulation.SyntaxErrorNear(previous);
35+
throw SimulatedSqlException.SyntaxErrorNear(previous);
3636
}
3737
}

SqlServerSimulator/Parser/Expression.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static Expression Parse(Simulation simulation, IEnumerator<Token> tokens,
2525
expression = new Value(atPrefixed, getVariableValue);
2626
break;
2727
case DoubleAtPrefixedString doubleAtPrefixedString:
28-
expression = new Value(simulation, doubleAtPrefixedString);
28+
expression = new Value(doubleAtPrefixedString);
2929
break;
3030
case Name name:
3131
if (name is UnquotedString && name.TryParse(out var keyword))
@@ -34,14 +34,14 @@ public static Expression Parse(Simulation simulation, IEnumerator<Token> tokens,
3434
{
3535
case Keyword.As:
3636
if (expression is null || !tokens.TryMoveNext(out token) || token is not Name alias)
37-
throw new SimulatedSqlException(simulation, "Incorrect syntax near the keyword 'as'.", 156, 15, 1);
37+
throw new SimulatedSqlException("Incorrect syntax near the keyword 'as'.", 156, 15, 1);
3838

3939
expression = new NamedExpression(expression, alias.Value);
4040
_ = tokens.TryMoveNext(out token);
4141
return expression;
4242
case Keyword.From:
4343
if (expression is null)
44-
throw new SimulatedSqlException(simulation, "Incorrect syntax near the keyword 'from'.", 156, 15, 1);
44+
throw new SimulatedSqlException("Incorrect syntax near the keyword 'from'.", 156, 15, 1);
4545

4646
return expression;
4747
}
@@ -53,7 +53,7 @@ public static Expression Parse(Simulation simulation, IEnumerator<Token> tokens,
5353
if (expression is null)
5454
throw new NotSupportedException("Simulated expression parser doesn't know how to handle + at the start of an expression.");
5555

56-
token = tokens.RequireNext(simulation);
56+
token = tokens.RequireNext();
5757

5858
expression = new Add(expression, Parse(simulation, tokens, ref token, getVariableValue));
5959
break;
@@ -64,11 +64,11 @@ public static Expression Parse(Simulation simulation, IEnumerator<Token> tokens,
6464
if (expression is not Reference reference)
6565
throw new NotSupportedException("Simulated expression parser doesn't know how to handle '.' here.");
6666

67-
reference.AddMultiPartComponent(tokens.RequireNext<Name>(simulation));
67+
reference.AddMultiPartComponent(tokens.RequireNext<Name>());
6868
break;
6969
case Comma:
7070
if (expression is null)
71-
throw simulation.SyntaxErrorNear(token);
71+
throw SimulatedSqlException.SyntaxErrorNear(token);
7272
return expression;
7373
default:
7474
throw new NotSupportedException($"Simulated expression parser doesn't know how to handle '{token}'.");
@@ -115,12 +115,12 @@ public Value(AtPrefixedString atPrefixed, Func<string, object?> getVariableValue
115115
this.value = getVariableValue(atPrefixed.Value);
116116
}
117117

118-
public Value(Simulation simulation, DoubleAtPrefixedString doubleAtPrefixedString)
118+
public Value(DoubleAtPrefixedString doubleAtPrefixedString)
119119
{
120120
switch (doubleAtPrefixedString.Parse())
121121
{
122122
case AtAtKeyword.Version:
123-
this.value = simulation.Version;
123+
this.value = "SQL Server Simulator";
124124
return;
125125
}
126126

SqlServerSimulator/Parser/Selection.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ internal sealed class Selection
1010

1111
public static Selection Parse(Simulation simulation, IEnumerator<Token> tokens, ref Token? token, Func<string, object?> getVariableValue)
1212
{
13-
token = tokens.RequireNext(simulation);
13+
token = tokens.RequireNext();
1414

1515
Dictionary<string, int> columnIndexes = [];
1616
List<Expression> expressions = [];
@@ -30,18 +30,18 @@ public static Selection Parse(Simulation simulation, IEnumerator<Token> tokens,
3030
case null: // "Select" with no "From".
3131
return new(new(
3232
columnIndexes,
33-
[[.. expressions.Select(x => x.Run(column => throw new SimulatedSqlException(simulation, $"Invalid column name '{column}'.", 207, 16, 1)))]]
33+
[[.. expressions.Select(x => x.Run(column => throw new SimulatedSqlException($"Invalid column name '{column}'.", 207, 16, 1)))]]
3434
));
3535

3636
case UnquotedString unquotedString:
3737
if (!unquotedString.TryParse(out var keyword) || keyword != Keyword.From)
3838
throw new NotSupportedException("Simulated selection processor expected a `from`.");
3939

40-
switch (token = tokens.RequireNext(simulation))
40+
switch (token = tokens.RequireNext())
4141
{
4242
case StringToken tableName:
4343
if (!simulation.Tables.TryGetValue(tableName.Value, out var table) && !simulation.SystemTables.Value.TryGetValue(tableName.Value, out table))
44-
throw new SimulatedSqlException(simulation, $"Invalid object name {tableName}.", 208, 16, 1);
44+
throw new SimulatedSqlException($"Invalid object name {tableName}.", 208, 16, 1);
4545

4646
if (tokens.TryMoveNext(out token))
4747
{
@@ -61,7 +61,7 @@ public static Selection Parse(Simulation simulation, IEnumerator<Token> tokens,
6161
table.Rows.Select<object?[], object?[]>(row => [..expressions.Select(x => x.Run(columnName =>
6262
{
6363
var columnIndex = table.Columns.FindIndex(column => Collation.Default.Equals(column.Name, columnName.Last()));
64-
return columnIndex == -1 ? throw new SimulatedSqlException(simulation, $"Invalid column name '{columnName}'.", 207, 16, 1) : row[columnIndex]; }))])));
64+
return columnIndex == -1 ? throw new SimulatedSqlException($"Invalid column name '{columnName}'.", 207, 16, 1) : row[columnIndex]; }))])));
6565
}
6666

6767
throw new NotSupportedException($"Simulated selection processor expected a source table, found {token}.");

SqlServerSimulator/Parser/Tokenizer.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ enum State
1717
Numeric
1818
}
1919

20-
public static IEnumerable<Token> Tokenize(Simulation simulation, string? command)
20+
public static IEnumerable<Token> Tokenize(string? command)
2121
{
2222
if (string.IsNullOrEmpty(command))
2323
throw new InvalidOperationException("ExecuteReader: CommandText property has not been initialized");
@@ -124,7 +124,7 @@ public static IEnumerable<Token> Tokenize(Simulation simulation, string? command
124124
state = State.None;
125125
break;
126126
case State.Numeric:
127-
yield return new Numeric(simulation, buffer);
127+
yield return new Numeric(buffer);
128128
state = State.None;
129129
break;
130130
}
@@ -146,7 +146,7 @@ public static IEnumerable<Token> Tokenize(Simulation simulation, string? command
146146
state = State.None;
147147
break;
148148
case State.Numeric:
149-
yield return new Numeric(simulation, buffer);
149+
yield return new Numeric(buffer);
150150
state = State.None;
151151
break;
152152
}
@@ -159,7 +159,7 @@ public static IEnumerable<Token> Tokenize(Simulation simulation, string? command
159159
continue;
160160

161161
case '-':
162-
c = commandEnumerator.GetNext(simulation, ref index);
162+
c = commandEnumerator.GetNext(ref index);
163163
switch (c)
164164
{
165165
case '-':
@@ -202,7 +202,7 @@ public static IEnumerable<Token> Tokenize(Simulation simulation, string? command
202202
switch (state)
203203
{
204204
case State.Numeric:
205-
yield return new Numeric(simulation, buffer);
205+
yield return new Numeric(buffer);
206206
break;
207207
case State.UnquotedString:
208208
yield return new UnquotedString(buffer);
@@ -230,7 +230,7 @@ public static IEnumerable<Token> Tokenize(Simulation simulation, string? command
230230
yield return new DoubleAtPrefixedString(buffer);
231231
break;
232232
case State.Numeric:
233-
yield return new Numeric(simulation, buffer);
233+
yield return new Numeric(buffer);
234234
break;
235235
}
236236
}
@@ -248,8 +248,8 @@ static bool TryGetNext(this CharEnumerator enumerator, out char c, ref int index
248248
return false;
249249
}
250250

251-
static char GetNext(this CharEnumerator enumerator, Simulation simulation, ref int index) => !enumerator.TryGetNext(out var c, ref index)
252-
? throw new SimulatedSqlException(simulation, $"Simulated syntax error at index {index}.")
251+
static char GetNext(this CharEnumerator enumerator, ref int index) => !enumerator.TryGetNext(out var c, ref index)
252+
? throw new SimulatedSqlException($"Simulated syntax error at index {index}.")
253253
: c;
254254

255255
static bool IsQuotedString(this State state) => state switch

SqlServerSimulator/Parser/Tokens/Numeric.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ internal sealed class Numeric : Token
66
{
77
public readonly IFormattable Value;
88

9-
public Numeric(Simulation simulation, StringBuilder buffer)
9+
public Numeric(StringBuilder buffer)
1010
{
1111
var number = buffer.ToString();
1212

@@ -28,7 +28,7 @@ public Numeric(Simulation simulation, StringBuilder buffer)
2828
return;
2929
}
3030

31-
throw new SimulatedSqlException(simulation, $"Simulated command tokenizer couldn't parse {number} as a number.");
31+
throw new SimulatedSqlException($"Simulated command tokenizer couldn't parse {number} as a number.");
3232
}
3333
public override string ToString() => this.Value.ToString(null, System.Globalization.CultureInfo.InvariantCulture);
3434
}

SqlServerSimulator/SimulatedSqlException.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Immutable;
1+
using SqlServerSimulator.Parser;
2+
using System.Collections.Immutable;
23
using System.Data.Common;
34
using System.Globalization;
45

@@ -12,17 +13,17 @@ namespace SqlServerSimulator;
1213
/// </summary>
1314
internal sealed class SimulatedSqlException : DbException
1415
{
15-
internal SimulatedSqlException(Simulation simulation, string? message)
16-
: this(simulation, message, [])
16+
internal SimulatedSqlException(string? message)
17+
: this(message, [])
1718
{
1819
}
1920

20-
internal SimulatedSqlException(Simulation simulation, string message, int number, byte @class, byte state)
21-
: this(simulation, message, new SimulatedSqlError(message, number, @class, state))
21+
internal SimulatedSqlException(string message, int number, byte @class, byte state)
22+
: this(message, new SimulatedSqlError(message, number, @class, state))
2223
{
2324
}
2425

25-
internal SimulatedSqlException(Simulation simulation, string? message, params SimulatedSqlError[] errors)
26+
internal SimulatedSqlException(string? message, params SimulatedSqlError[] errors)
2627
: base(message ?? "Simulated exception with no message.")
2728
{
2829
base.HResult = unchecked((int)0x80131904);
@@ -45,10 +46,12 @@ internal SimulatedSqlException(Simulation simulation, string? message, params Si
4546

4647
var data = this.Data;
4748

48-
foreach (var kv in simulation.DbExceptionData)
49-
data.Add(kv.Key, kv.Value);
50-
51-
data["HelpLink.EvtID"] = firstError.Number.ToString(CultureInfo.InvariantCulture);
49+
data.Add("HelpLink.ProdName", "Microsoft SQL Server");
50+
data.Add("HelpLink.ProdVer", "99.00.1000");
51+
data.Add("HelpLink.EvtSrc", "MSSQLServer");
52+
data.Add("HelpLink.EvtID", firstError.Number.ToString(CultureInfo.InvariantCulture));
53+
data.Add("HelpLink.BaseHelpUrl", "https://go.microsoft.com/fwlink");
54+
data.Add("HelpLink.LinkId", "20476");
5255
}
5356

5457
/// <inheritdoc/>
@@ -80,4 +83,6 @@ internal SimulatedSqlException(Simulation simulation, string? message, params Si
8083
public byte State { get; }
8184

8285
public IReadOnlyList<SimulatedSqlError> Errors { get; }
86+
87+
internal static SimulatedSqlException SyntaxErrorNear(Token token) => new($"Incorrect syntax near '{token}'.", 102, 15, 1);
8388
}

0 commit comments

Comments
 (0)