Skip to content

Commit 424af81

Browse files
authored
Merge pull request #122 from ArchipelagoMW/part_type_conversion_attempt
Part type conversion attempt
2 parents b678997 + dda0939 commit 424af81

File tree

8 files changed

+104
-18
lines changed

8 files changed

+104
-18
lines changed

Archipelago.MultiClient.Net.Tests/MessageParsingFixture.cs

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using Archipelago.MultiClient.Net.Converters;
2+
using Archipelago.MultiClient.Net.Enums;
3+
using Archipelago.MultiClient.Net.Models;
24
using Archipelago.MultiClient.Net.Packets;
35
using Newtonsoft.Json;
46
using NUnit.Framework;
@@ -74,21 +76,79 @@ public void Should_handle_multiple_packets_in_same_message()
7476
Assert.That(packets.OfType<LocationInfoPacket>().Count(), Is.EqualTo(1));
7577
}
7678

77-
[Test, Ignore("The lib currently not future compatible as it does not handle new types it does not know")]
78-
public void Should_not_throw_on_unknown_message_part_type()
79+
[Test]
80+
public void Should_correctly_parse_unknown_enum_for_print_json()
7981
{
82+
// message part type "region_id"
83+
// print json type "NewType"
84+
// hintstatus 9
8085
const string message =
81-
@"[{""cmd"":""PrintJSON"",""data"":[{""text"":""[Hint]: ""},{""text"":""(some new type of element)"",""new_value"":1337,""type"":""other_type""}],""type"":""Hint"",""receiving"":1,""item"":{""item"":1337116,""location"":1337109,""player"":2,""flags"":1,""class"":""NetworkItem""},""found"":false}]";
86+
@"[{""cmd"":""PrintJSON"",""data"":[{""text"":""[Hint]: ""},{""text"":""86"",""type"":""region_id""},{""text"":""'s ""},{""text"":""1337049"",""player"":2,""flags"":0,""type"":""item_id""},{""text"":"" is at ""},{""text"":""1337010"",""player"":2,""type"":""location_id""},{""text"":"" in ""},{""text"":""2"",""type"":""player_id""},{""text"":""'s World""},{""text"":"". ""},{""text"":""NEW FUTURE STATUS"",""hint_status"":9,""type"":""hint_status""}],""type"":""NewType"",""receiving"":2,""item"":{""item"":1337049,""location"":1337010,""player"":2,""flags"":0,""class"":""NetworkItem""},""found"":false}]";
8287

83-
List<ArchipelagoPacketBase> packets = null;
84-
Assert.DoesNotThrow(() =>
85-
{
86-
packets = JsonConvert.DeserializeObject<List<ArchipelagoPacketBase>>(message, Converter);
87-
});
88+
var packets = JsonConvert.DeserializeObject<List<ArchipelagoPacketBase>>(message, Converter);
89+
90+
Assert.That(packets, Is.Not.Null);
91+
Assert.That(packets.Count, Is.EqualTo(1));
92+
93+
var printJson = packets[0] as PrintJsonPacket;
94+
95+
Assert.That(printJson, Is.Not.Null);
96+
Assert.That(printJson.MessageType, Is.Null); // "NewType" cannot be parsed
97+
98+
Assert.That(printJson.Data[0].Type , Is.Null);
99+
Assert.That(printJson.Data[1].Type , Is.Null); //region_id cannot be parsed
100+
Assert.That(printJson.Data[2].Type , Is.Null);
101+
Assert.That(printJson.Data[3].Type , Is.EqualTo(JsonMessagePartType.ItemId));
102+
Assert.That(printJson.Data[4].Type , Is.Null);
103+
Assert.That(printJson.Data[5].Type , Is.EqualTo(JsonMessagePartType.LocationId));
104+
Assert.That(printJson.Data[6].Type , Is.Null);
105+
Assert.That(printJson.Data[7].Type , Is.EqualTo(JsonMessagePartType.PlayerId));
106+
Assert.That(printJson.Data[8].Type , Is.Null);
107+
Assert.That(printJson.Data[9].Type , Is.Null);
108+
Assert.That(printJson.Data[10].HintStatus, Is.EqualTo((HintStatus)9)); // 9 is not a valid hint status
109+
}
110+
111+
[Test]
112+
public void Should_correctly_parse_unknown_connection_refused()
113+
{
114+
// errors "NewErrorType"
115+
const string message = @"[{""cmd"":""ConnectionRefused"",""errors"":[""InvalidSlot"", ""NewErrorType""]}]";
116+
117+
var packets = JsonConvert.DeserializeObject<List<ArchipelagoPacketBase>>(message, Converter);
88118

89119
Assert.That(packets, Is.Not.Null);
90120
Assert.That(packets.Count, Is.EqualTo(1));
91-
Assert.That(packets.OfType<HintPrintJsonPacket>().Count(), Is.EqualTo(1));
121+
122+
var connectionRefusedPacket = packets[0] as ConnectionRefusedPacket;
123+
124+
Assert.That(connectionRefusedPacket, Is.Not.Null);
125+
126+
Assert.That(connectionRefusedPacket.Errors.Length, Is.EqualTo(2));
127+
128+
Assert.That(connectionRefusedPacket.Errors[0], Is.EqualTo(ConnectionRefusedError.InvalidSlot));
129+
Assert.That(connectionRefusedPacket.Errors[1], Is.EqualTo(ConnectionRefusedError.UnknownError));
130+
}
131+
132+
[Test]
133+
public void Should_correctly_parse_unknown_data_storage_opperations()
134+
{
135+
// opperation type "something_specail"
136+
const string message = @"[{""cmd"":""SetReply"",""key"":""GiftBox;0;2"",""default"":{},""operations"":[{""operation"":""default"",""value"":null},{""operation"":""something_specail"",""value"":null},{""operation"":""left_shift"",""value"":1}],""want_reply"":false,""original_value"":{},""slot"":2,""value"":{}}]";
137+
138+
var packets = JsonConvert.DeserializeObject<List<ArchipelagoPacketBase>>(message, Converter);
139+
140+
Assert.That(packets, Is.Not.Null);
141+
Assert.That(packets.Count, Is.EqualTo(1));
142+
143+
var connectionRefusedPacket = packets[0] as SetReplyPacket;
144+
145+
Assert.That(connectionRefusedPacket, Is.Not.Null);
146+
147+
Assert.That(connectionRefusedPacket.Operations.Length, Is.EqualTo(3));
148+
149+
Assert.That(connectionRefusedPacket.Operations[0].OperationType, Is.EqualTo(OperationType.Default));
150+
Assert.That(connectionRefusedPacket.Operations[1].OperationType, Is.EqualTo(OperationType.Unknown));
151+
Assert.That(connectionRefusedPacket.Operations[2].OperationType, Is.EqualTo(OperationType.LeftShift));
92152
}
93153
}
94154
}

Archipelago.MultiClient.Net/Archipelago.MultiClient.Net.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
<PackageReadmeFile>README.md</PackageReadmeFile>
1111
<RepositoryUrl>https://github.com/ArchipelagoMW/Archipelago.MultiClient.Net</RepositoryUrl>
1212
<RepositoryType>git</RepositoryType>
13-
<AssemblyVersion>6.6.0.0</AssemblyVersion>
14-
<FileVersion>6.6.0.0</FileVersion>
15-
<Version>6.6.0</Version>
13+
<AssemblyVersion>6.6.1.0</AssemblyVersion>
14+
<FileVersion>6.6.1.0</FileVersion>
15+
<Version>6.6.1</Version>
1616
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1717
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
1818
<PackageIcon>blue-icon.png</PackageIcon>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Converters;
3+
using System;
4+
5+
public class AttemptingStringEnumConverter : StringEnumConverter
6+
{
7+
public AttemptingStringEnumConverter() : base() { }
8+
9+
public AttemptingStringEnumConverter(Type namingStrategyType) : base(namingStrategyType) { }
10+
11+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
12+
{
13+
try
14+
{
15+
return base.ReadJson(reader, objectType, existingValue, serializer);
16+
}
17+
catch (JsonSerializationException)
18+
{
19+
return objectType.IsValueType ? Activator.CreateInstance(objectType) : null;
20+
}
21+
}
22+
}

Archipelago.MultiClient.Net/Enums/ConnectionRefusedError.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
/// </summary>
66
public enum ConnectionRefusedError
77
{
8+
/// <summary>
9+
/// Indicates that server the server send en error code not known to this library.
10+
/// </summary>
11+
UnknownError = 0,
12+
813
/// <summary>
914
/// Indicates that the sent 'name' field did not match any auth entry on the server.
1015
/// </summary>

Archipelago.MultiClient.Net/Enums/OperationType.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
public enum OperationType
77
{
88
#pragma warning disable CS1591
9+
Unknown = 0,
910
Add,
1011
Mul,
1112
Max,

Archipelago.MultiClient.Net/Models/JsonMessagePart.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
using Archipelago.MultiClient.Net.Enums;
22
using Newtonsoft.Json;
3-
using Newtonsoft.Json.Converters;
43
using Newtonsoft.Json.Serialization;
54

65
namespace Archipelago.MultiClient.Net.Models
76
{
87
public class JsonMessagePart
98
{
109
[JsonProperty("type")]
11-
[JsonConverter(typeof(StringEnumConverter), typeof(SnakeCaseNamingStrategy))]
10+
[JsonConverter(typeof(AttemptingStringEnumConverter), typeof(SnakeCaseNamingStrategy))]
1211
public JsonMessagePartType? Type { get; set; }
1312

1413
[JsonProperty("color")]
15-
[JsonConverter(typeof(StringEnumConverter), typeof(SnakeCaseNamingStrategy))]
14+
[JsonConverter(typeof(AttemptingStringEnumConverter), typeof(SnakeCaseNamingStrategy))]
1615
public JsonMessagePartColor? Color { get; set; }
1716

1817
[JsonProperty("text")]

Archipelago.MultiClient.Net/Models/OperationSpecification.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class OperationSpecification
2020
{
2121
/// <inheritdoc cref="T:Archipelago.MultiClient.Net.Models.OperationType"/>
2222
[JsonProperty("operation")]
23-
[JsonConverter(typeof(StringEnumConverter), typeof(SnakeCaseNamingStrategy))]
23+
[JsonConverter(typeof(AttemptingStringEnumConverter), typeof(SnakeCaseNamingStrategy))]
2424
public OperationType OperationType;
2525

2626
/// <summary>
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
using Archipelago.MultiClient.Net.Enums;
22
using Newtonsoft.Json;
3-
using Newtonsoft.Json.Converters;
43

54
namespace Archipelago.MultiClient.Net.Packets
65
{
76
public class ConnectionRefusedPacket : ArchipelagoPacketBase
87
{
98
public override ArchipelagoPacketType PacketType => ArchipelagoPacketType.ConnectionRefused;
109

11-
[JsonProperty("errors", ItemConverterType = typeof(StringEnumConverter))]
10+
[JsonProperty("errors", ItemConverterType = typeof(AttemptingStringEnumConverter))]
1211
public ConnectionRefusedError[] Errors { get; set; }
1312
}
1413
}

0 commit comments

Comments
 (0)