using Newtonsoft.Json; using NUnit.Framework; using System; using System.Linq; using TINK.Model.Bike; using TINK.Model.Connector; using TINK.Repository.Exception; using TINK.Repository.Response; using JsonConvertRethrow = TINK.Repository.Response.JsonConvertRethrow; namespace TestTINKLib.Fixtures.Connector { [TestFixture] public class TestTextToTypeHelper { [Test] public void TestGetWheelType_InvalidDescription() { var l_oInfo = new BikeInfoBase(); // Verify prerequisites Assert.IsNull(l_oInfo.description); // Verify behaviour of member. Assert.IsNull(TextToTypeHelper.GetWheelType(l_oInfo)); } [Test] public void TestGetWheelType() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""2"", ""bike_group"" : [ ""TINK"" ], ""description"" : ""Cargo Long"", ""gps"" : { ""latitude"": ""47.6612083333"", ""longitude"": ""9.16637533333"" }, ""station"" : ""9"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.AreEqual(WheelType.Two, TextToTypeHelper.GetWheelType(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""11"", ""bike_group"" : [ ""TINK"" ], ""description"" : ""Cargo Trike"", ""gps"" : { ""latitude"": ""47.665051"", ""longitude"": ""9.174096"" }, ""station"" : ""1"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.AreEqual(WheelType.Trike, TextToTypeHelper.GetWheelType(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""51"", ""bike_group"" : [ ""Konrad"" ], ""description"" : ""Demo Stadtrad"", ""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" }, ""station"" : ""8"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.AreEqual(WheelType.Two, TextToTypeHelper.GetWheelType(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""51"", ""bike_group"" : [ ""Konrad"" ], ""description"" : ""Stadtrad"", ""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" }, ""station"" : ""8"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.AreEqual(WheelType.Two, TextToTypeHelper.GetWheelType(l_oInfo)); } [Test] public void TestGetTypeOfBike_InvalidDescription() { var l_oInfo = new BikeInfoBase(); // Verify prerequisites Assert.IsNull(l_oInfo.description); // Verify behaviour of member. Assert.IsNull(TextToTypeHelper.GetTypeOfBike(l_oInfo)); } [Test] public void TestGetTypeOfBike() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""2"", ""bike_group"" : [ ""TINK"" ], ""description"" : ""Cargo Long"", ""gps"" : { ""latitude"": ""47.6612083333"", ""longitude"": ""9.16637533333"" }, ""station"" : ""9"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.AreEqual(TypeOfBike.Cargo, TextToTypeHelper.GetTypeOfBike(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""11"", ""bike_group"" : [ ""TINK"" ], ""description"" : ""Cargo Trike"", ""gps"" : { ""latitude"": ""47.665051"", ""longitude"": ""9.174096"" }, ""station"" : ""1"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.AreEqual(TypeOfBike.Cargo, TextToTypeHelper.GetTypeOfBike(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""51"", ""bike_group"" : [ ""Konrad"" ], ""description"" : ""Demo Stadtrad"", ""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" }, ""station"" : ""8"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.AreEqual(TypeOfBike.Citybike, TextToTypeHelper.GetTypeOfBike(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""51"", ""bike_group"" : [ ""Konrad"" ], ""description"" : ""Stadtrad"", ""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" }, ""station"" : ""8"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.AreEqual(TypeOfBike.Citybike, TextToTypeHelper.GetTypeOfBike(l_oInfo)); } [Test] public void TestGetState_InvalidDescription() { var l_oInfo = new BikeInfoBase(); // Verify prerequisites Assert.IsNull(l_oInfo.state); // Verify behaviour of member. Assert.Throws>(() => TextToTypeHelper.GetState(l_oInfo)); } [Test] public void TestGetIsDemo() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""2"", ""bike_group"" : [ ""TINK"" ], ""description"" : ""Cargo Long"", ""gps"" : { ""latitude"": ""47.6612083333"", ""longitude"": ""9.16637533333"" }, ""station"" : ""9"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.IsFalse(TextToTypeHelper.GetIsDemo(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""11"", ""bike_group"" : [ ""TINK"" ], ""description"" : ""Cargo Trike"", ""gps"" : { ""latitude"": ""47.665051"", ""longitude"": ""9.174096"" }, ""station"" : ""1"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.IsFalse(TextToTypeHelper.GetIsDemo(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""51"", ""bike_group"" : [ ""Konrad"" ], ""description"" : ""Demo Stadtrad"", ""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" }, ""station"" : ""8"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.IsTrue(TextToTypeHelper.GetIsDemo(l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""bike"" : ""51"", ""bike_group"" : [ ""Konrad"" ], ""description"" : ""Stadtrad"", ""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" }, ""station"" : ""8"", ""state"" : ""available"" }"); // Verify behaviour of member. Assert.IsFalse(TextToTypeHelper.GetIsDemo(l_oInfo)); } [Test] public void TestGetPosition() { Assert.AreEqual(1.234d, TextToTypeHelper.GetPosition(JsonConvert.DeserializeObject("{ \"latitude\" : \"1.234\", \"longitude\" : \"5.678\"}")).Latitude); Assert.AreEqual(5.678d, TextToTypeHelper.GetPosition(JsonConvert.DeserializeObject("{ \"latitude\" : \"1.234\", \"longitude\" : \"5.678\"}")).Longitude); } [Test] public void TestGetStationGroup_Invalid() { var l_oStation = JsonConvertRethrow.DeserializeObject( @"{ ""station"" : ""4"", ""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" } }"); // From COPRI version v4.1 no more exception thrown. Assert.That(l_oStation.GetGroup().Count(), Is.EqualTo(0)); } [Test] public void TestGetStationGroup_TINK() { var l_oStation = JsonConvertRethrow.DeserializeObject( @"{ ""station"" : ""4"", ""station_group"" : [ ""TINK"" ], ""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" } }"); Assert.AreEqual("TINK", string.Join(",", l_oStation.GetGroup().ToArray())); } [Test] public void TestGetStationGroup_TINKAndKonrad() { var l_oStation = JsonConvertRethrow.DeserializeObject( @"{ ""station"" : ""4"", ""station_group"": [ ""TINK"", ""Konrad"" ], ""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" } }"); Assert.AreEqual("TINK,Konrad", string.Join(",", l_oStation.GetGroup().ToArray())); } [Test] public void TestGetBikeGroup_TINK() { var l_oBike = JsonConvertRethrow.DeserializeObject( @"{ ""state"" : ""available"", ""bike"" : ""18"", ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""station"" : ""13"", }"); Assert.AreEqual("TINK", string.Join(",", l_oBike.GetGroup().ToArray())); } [Test] public void TestGetBikeGroup_TINKCopri() { var l_oBike = JsonConvertRethrow.DeserializeObject( @"{ ""state"" : ""available"", ""bike"" : ""18"", ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""system"" : ""BC"", ""station"" : ""13"", }"); Assert.AreEqual("TINK", string.Join(",", l_oBike.GetGroup().ToArray())); } [Test] public void TestGetBikeGroup_TINKSMS() { var l_oBike = JsonConvertRethrow.DeserializeObject( @"{ ""state"" : ""available"", ""bike"" : ""18"", ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""system"" : ""Lock"", ""station"" : ""13"", }"); Assert.AreEqual("TINK", string.Join(",", l_oBike.GetGroup().ToArray())); } [Test] public void TestGetBikeGroup_Konrad() { var l_oBike = JsonConvertRethrow.DeserializeObject( @"{ ""state"" : ""available"", ""bike"" : ""18"", ""description"" : ""Cargo Long"", ""bike_group"" : [ ""Konrad"" ], ""station"" : ""13"", }"); Assert.AreEqual("Konrad", string.Join(",", l_oBike.GetGroup().ToArray())); } [Test] public void TestGetBikeGroup_Null() { var l_oBike = JsonConvertRethrow.DeserializeObject( @"{ ""state"" : ""available"", ""bike"" : ""18"", ""description"" : ""Cargo Long"", ""station"" : ""13"", }"); Assert.AreEqual(0, l_oBike.GetGroup().ToArray().Length); } [Test] public void TestGetAuthGroup() { // User group was of format [ ""TINK"", ""Konrad"" ] in early day... // Since COPRI 4.1 use group is no more used. // Groups are of format _ for this user group would be like below if it would be used. var response = JsonConvertRethrow.DeserializeObject(@" { ""response"" : ""authorization"", ""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51a"", ""user_group"" : [ ""KN_300102"", ""KN_300101"" ], ""response_state"" : ""OK"", ""apiserver"" : ""https://tinkwwp.copri-bike.de"" }"); Assert.AreEqual(2, response.GetGroup().ToList().Count); Assert.AreEqual($"KN_300102", response.GetGroup().ToList()[0]); Assert.AreEqual($"KN_300101", response.GetGroup().ToList()[1]); } [Test] public void TestGetGroupString() { // From COPRI version v4.1 no more exception thrown. Assert.That(TextToTypeHelper.GetGroup(new string[0]).Count(), Is.EqualTo(0)); } [Test] public void TestGetGroupString_Null() { // From COPRI version v4.1 no more exception thrown. Assert.That(TextToTypeHelper.GetGroup((string[])null).Count(), Is.EqualTo(0)); } [Test] public void TestGetGroupString_Roundtrip() { Assert.AreEqual("Tunk,Unk", TextToTypeHelper.GetGroup(TextToTypeHelper.GetGroup(new [] { "Tunk", "Unk" }))); } [Test] public void TestGetUserKey() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""total_price"": ""0.00"", ""gps"" : { ""latitude"": ""47.6586133"", ""longitude"": ""9.16864"" }, ""unit_price"": ""3.00"", ""K_u"": ""[99, 104, 120, 121, 63, 99, -10, -110, 94, 70, 15, -112, -6, 101, 117, -90, -113, -54, -90, -95, 0, 0, 0, 0]"", ""tariff_description"": {""name"" : ""TINK Basic""}, ""end_time"": ""2020-04-07 16:55:18"", ""K_seed"": ""[-18, -80, 20, -90, 3, 69, 96, 4, -35, 75, -95, 102, 7, 121, -122, 15]"", ""system"": ""Ilockit"", ""bike"": ""16"", ""computed_hours"": ""0"", ""request_time"": ""2020-04-07 16:55:06.823436+02"", ""bike_group"" : [ ""TINK"" ], ""K_a"": ""[-19, 29, -60, 29, 35, -121, -69, 93, 27, -122, 107, -127, -30, 74, 82, 12, 4, -20, 40, 16, 0, 0, 0, 0]"", ""state"": ""occupied"", ""real_hours"": ""0"", ""station"" : ""7"", ""start_time"": ""2020-04-07 16:55:17.786551+02"", ""description"": ""Cargo Long"" }"); Assert.AreEqual( 99, TextToTypeHelper.GetUserKey(l_oInfo)[0]); Assert.AreEqual( 104, TextToTypeHelper.GetUserKey(l_oInfo)[1]); } [Test] public void TestGetAdminKey() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""total_price"": ""0.00"", ""gps"" : { ""latitude"": ""47.6586133"", ""longitude"": ""9.16864"" }, ""unit_price"": ""3.00"", ""K_u"": ""[99, 104, 120, 121, 63, 99, -10, -110, 94, 70, 15, -112, -6, 101, 117, -90, -113, -54, -90, -95, 0, 0, 0, 0]"", ""tariff_description"": {""name"" : ""TINK Basic""}, ""end_time"": ""2020-04-07 16:55:18"", ""K_seed"": ""[-18, -80, 20, -90, 3, 69, 96, 4, -35, 75, -95, 102, 7, 121, -122, 15]"", ""system"": ""Ilockit"", ""bike"": ""16"", ""computed_hours"": ""0"", ""request_time"": ""2020-04-07 16:55:06.823436+02"", ""bike_group"" : [ ""TINK"" ], ""K_a"": ""[-19, 29, -60, 29, 35, -121, -69, 93, 27, -122, 107, -127, -30, 74, 82, 12, 4, -20, 40, 16, 0, 0, 0, 0]"", ""state"": ""occupied"", ""real_hours"": ""0"", ""station"" : ""7"", ""start_time"": ""2020-04-07 16:55:17.786551+02"", ""description"": ""Cargo Long"" }"); Assert.AreEqual( 237, TextToTypeHelper.GetAdminKey(l_oInfo)[0]); Assert.AreEqual( 29, TextToTypeHelper.GetAdminKey(l_oInfo)[1]); } [Test] public void TestGetSeed() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""total_price"": ""0.00"", ""gps"" : { ""latitude"": ""47.6586133"", ""longitude"": ""9.16864"" }, ""unit_price"": ""3.00"", ""K_u"": ""[99, 104, 120, 121, 63, 99, -10, -110, 94, 70, 15, -112, -6, 101, 117, -90, -113, -54, -90, -95, 0, 0, 0, 0]"", ""tariff_description"": {""name"" : ""TINK Basic""}, ""end_time"": ""2020-04-07 16:55:18"", ""K_seed"": ""[-18, -80, 20, -90, 3, 69, 96, 4, -35, 75, -95, 102, 7, 121, -122, 15]"", ""system"": ""Ilockit"", ""bike"": ""16"", ""computed_hours"": ""0"", ""request_time"": ""2020-04-07 16:55:06.823436+02"", ""bike_group"" : [ ""TINK"" ], ""K_a"": ""[-19, 29, -60, 29, 35, -121, -69, 93, 27, -122, 107, -127, -30, 74, 82, 12, 4, -20, 40, 16, 0, 0, 0, 0]"", ""state"": ""occupied"", ""real_hours"": ""0"", ""station"" : ""7"", ""start_time"": ""2020-04-07 16:55:17.786551+02"", ""description"": ""Cargo Long"" }"); Assert.AreEqual( 238, TextToTypeHelper.GetSeed(l_oInfo)[0]); Assert.AreEqual( 176, TextToTypeHelper.GetSeed(l_oInfo)[1]); } [Test] public void TestGetSeedUserKeyAdminKey_Invalid() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""total_price"": ""0.00"", ""gps"" : { ""latitude"": ""47.6586133"", ""longitude"": ""9.16864"" }, ""unit_price"": ""3.00"", ""K_u"": ""[]"", ""tariff_description"": {""name"" : ""TINK Basic""}, ""end_time"": ""2020-04-07 16:55:18"", ""K_seed"": ""[-18a, -80, 20, -90, 3, 69, 96, 4, -35, 75, -95, 102, 7, 121, -122, 15]"", ""system"": ""Ilockit"", ""bike"": ""16"", ""computed_hours"": ""0"", ""request_time"": ""2020-04-07 16:55:06.823436+02"", ""bike_group"" : [ ""TINK"" ], ""K_a"": ""{-19, 29, -60, 29, 35, -121, -69, 93, 27, -122, 107, -127, -30, 74, 82, 12, 4, -20, 40, 16, 0, 0, 0, 0}"", ""state"": ""occupied"", ""real_hours"": ""0"", ""station"" : ""7"", ""start_time"": ""2020-04-07 16:55:17.786551+02"", ""description"": ""Cargo Long"" }"); Assert.AreEqual( 0, TextToTypeHelper.GetSeed(l_oInfo).Length); Assert.AreEqual( 0, TextToTypeHelper.GetUserKey(l_oInfo).Length); Assert.AreEqual( 0, TextToTypeHelper.GetAdminKey(l_oInfo).Length); } [Test] public void TestGetBluetoothLockId_FromBikeInfo_Invalid() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { }"); Assert.AreEqual(0, TextToTypeHelper.GetBluetoothLockId (l_oInfo)); l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""Ilockit_ID"": """" }"); Assert.AreEqual(0, TextToTypeHelper.GetBluetoothLockId(l_oInfo)); } [Test] public void TestGetBluetoothLockId_FromBikeInfo() { var l_oInfo = JsonConvertRethrow.DeserializeObject(@" { ""Ilockit_ID"": ""ISHAREIT-132"" }"); Assert.AreEqual( 132, TextToTypeHelper.GetBluetoothLockId(l_oInfo)); } [Test] public void TestGetBluetoothLockId_FromString_Invalid() { Assert.AreEqual(0, TextToLockItTypeHelper.GetBluetoothLockId((string)null)); Assert.AreEqual(0, TextToLockItTypeHelper.GetBluetoothLockId("")); Assert.AreEqual(0, TextToLockItTypeHelper.GetBluetoothLockId("HubbaBubba")); } [Test] public void TestGetBluetoothLockId_FromString() { Assert.AreEqual( 132, TextToLockItTypeHelper.GetBluetoothLockId("ISHAREIT-132")); Assert.AreEqual( 132, TextToLockItTypeHelper.GetBluetoothLockId("ISHAREIT+132")); } [Test] public void TestGetCopriVersion() { var version = JsonConvertRethrow.DeserializeObject(@" { ""copri_version"": ""4.3.2.1"" }"); Assert.That( version.GetCopriVersion(), Is.EqualTo(new Version(4,3,2,1))); } [Test] public void TestGetCopriVersion_Invald() { var version = JsonConvertRethrow.DeserializeObject(@" { ""copri_version"": ""hellO"" }"); Assert.That( () => version.GetCopriVersion(), Throws.InstanceOf()); } [Test] public void TestGetCopriVersion_Null() { Assert.That( () => TextToTypeHelper.GetCopriVersion(null), Throws.InstanceOf()); } [Test] public void TestGetCopriVersion_NotContained() { var version = JsonConvertRethrow.DeserializeObject(@" { }"); Assert.That( () => version.GetCopriVersion(), Throws.InstanceOf()); } } }