diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fc2e12..9be832a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +Versions **< 3.0.0** are **DEPRECATED** + +## 3.0.0 (2020-01-06) + +### Breaking changes + +- **Ship**: + - `buildTime` type change from `String` to `ShipConstruction`. + - `misc.voice` type change from `String` to `Url`. + ## 2.0.1 (2019-12-11) ### Bug fixes diff --git a/src/main/kotlin/com/github/azurapi/azurapikotlin/internal/entities/Ship.kt b/src/main/kotlin/com/github/azurapi/azurapikotlin/internal/entities/Ship.kt index 73171a9..fb81e73 100644 --- a/src/main/kotlin/com/github/azurapi/azurapikotlin/internal/entities/Ship.kt +++ b/src/main/kotlin/com/github/azurapi/azurapikotlin/internal/entities/Ship.kt @@ -23,7 +23,7 @@ data class SkinInfo ( val enClient: String, val cnClient: String, val jpClient: String, - val obtainedFrom: String, + val obtainedFrom: String?, val cost: Int, val isLive2D: Boolean ) @@ -112,6 +112,24 @@ data class Url ( val url: String ) +/** + * Construction info of a ship + * @param constructionTime + * @param light + * @param heavy + * @param aviation + * @param limited + * @param exchange + */ +data class ShipConstruction ( + val constructionTime: String, + val light: Boolean, + val heavy: Boolean, + val aviation: Boolean, + val limited: Boolean, + val exchange: Boolean +) + /** * Miscellaneous info of a ship * @param voice @@ -121,7 +139,7 @@ data class Url ( * @param pixiv */ data class Miscellaneous ( - val voice: String, + val voice: Url?, val twitter: Url?, val artist: String?, val web: Url?, @@ -153,10 +171,11 @@ data class Ship ( val hullType: String, val thumbnail: String, val skins: List<Skin>, - val buildTime: String, val rarity: String, val stars: Stars?, val stats: Stats?, + // No construction info for unreleased ships + val construction: ShipConstruction?, val misc: Miscellaneous? ) diff --git a/src/main/kotlin/com/github/azurapi/azurapikotlin/utils/ShipParser.kt b/src/main/kotlin/com/github/azurapi/azurapikotlin/utils/ShipParser.kt index 6e13597..c4ff574 100644 --- a/src/main/kotlin/com/github/azurapi/azurapikotlin/utils/ShipParser.kt +++ b/src/main/kotlin/com/github/azurapi/azurapikotlin/utils/ShipParser.kt @@ -28,16 +28,16 @@ object ShipParser { } try { return SkinInfo( - enClient = json.optString("EN Client"), - cnClient = json.optString("CN Client"), - jpClient = json.optString("JP Client"), - obtainedFrom = json.getString("Obtained From"), + enClient = json.optString("enClient"), + cnClient = json.optString("cnClient"), + jpClient = json.optString("jpClient"), + obtainedFrom = json.optString("obtainedFrom"), cost = try { - json.optString("Cost").toInt() + json.optString("cost").toInt() } catch (e: NumberFormatException) { 0 }, - isLive2D = json.getString("Live2D Model") == "Yes" + isLive2D = json.getBoolean("live2DModel") ) } catch (e: JSONException) { throw e @@ -68,20 +68,20 @@ object ShipParser { private fun jsonToStatsDetails(json: JSONObject): StatsDetails { try { return StatsDetails( - speed = json.getInt("Speed"), - accuracy = json.getInt("Accuracy (Hit)"), - antiAir = json.getInt("Anti-air"), - antiSub = json.getInt("Anti-submarine warfare"), - armor = json.getString("Armor"), - aviation = json.getInt("Aviation"), - evasion = json.getInt("Evasion"), - firepower = json.getInt("Firepower"), - health = json.getInt("Health"), - luck = json.getInt("Luck"), + speed = json.getInt("speed"), + accuracy = json.getInt("accuracyHit"), + antiAir = json.getInt("antiair"), + antiSub = json.getInt("antisubmarineWarfare"), + armor = json.getString("armor"), + aviation = json.getInt("aviation"), + evasion = json.getInt("evasion"), + firepower = json.getInt("firepower"), + health = json.getInt("health"), + luck = json.getInt("luck"), // FIXME: it should be defined - oil = json.optInt("Oil consumption"), - reload = json.getInt("Reload"), - torpedo = json.getInt("Torpedo") + oil = json.optInt("oilConsumption"), + reload = json.getInt("reload"), + torpedo = json.getInt("torpedo") ) } catch (e: JSONException) { throw e @@ -96,17 +96,17 @@ object ShipParser { return Stats( level120 = jsonToStatsDetails( json.getJSONObject( - "Level 120" + "level120" ) ), level100 = jsonToStatsDetails( json.getJSONObject( - "Level 100" + "level100" ) ), base = jsonToStatsDetails( json.getJSONObject( - "Base Stats" + "baseStats" ) ) ) @@ -143,6 +143,26 @@ object ShipParser { } } + private fun jsonToConstruction(json: JSONObject?): ShipConstruction? { + if (json == null) { + return null + } + try { + val availability = json.getJSONObject("availableIn") + // FIXME: not always a boolean + return ShipConstruction( + constructionTime = json.getString("constructionTime"), + light = availability.optBoolean("light", true), + heavy = availability.optBoolean("heavy", true), + aviation = availability.optBoolean("aviation", true), + limited = availability.optBoolean("limited", true), + exchange = availability.optBoolean("exchange", true) + ) + } catch (e: JSONException) { + throw e + } + } + private fun jsonToMiscellaneous(json: JSONObject?): Miscellaneous? { if (json == null) { return null @@ -165,7 +185,11 @@ object ShipParser { "twitter" ) ), - voice = json.optString("voice") + voice = jsonToUrl( + json.optJSONObject( + "voice" + ) + ) ) } catch (e: JSONException) { throw e @@ -177,7 +201,6 @@ object ShipParser { return Ship( wikiUrl = json.getString("wikiUrl"), id = json.getString("id"), - buildTime = json.optString("buildTime"), hullType = json.getString("hullType"), nationality = json.getString("nationality"), rarity = json.getString("rarity"), @@ -203,6 +226,11 @@ object ShipParser { "stars" ) ), + construction = jsonToConstruction( + json.optJSONObject( + "construction" + ) + ), misc = jsonToMiscellaneous( json.optJSONObject( "misc" diff --git a/src/test/kotlin/com/github/azurapi/azurapikotlin/json/ShipParserTestCase.kt b/src/test/kotlin/com/github/azurapi/azurapikotlin/json/ShipParserTestCase.kt index a9fb070..40dd09e 100644 --- a/src/test/kotlin/com/github/azurapi/azurapikotlin/json/ShipParserTestCase.kt +++ b/src/test/kotlin/com/github/azurapi/azurapikotlin/json/ShipParserTestCase.kt @@ -15,175 +15,315 @@ class ShipParserTestCase: StringSpec() { init { "it should correctly parse Atago" { val json = JSONObject(""" - {"201": { - "wikiUrl": "https://azurlane.koumakan.jp/Atago", - "id": "201", - "names": { - "en": "Atago", - "cn": "爱宕", - "jp": "愛宕", - "kr": "아타고" - }, - "class": "Takao", - "nationality": "Sakura Empire", - "hullType": "Heavy Cruiser", - "thumbnail": "https://azurlane.koumakan.jp/w/images/0/0c/AtagoIcon.png", - "skins": [ - { - "name": "Default", - "image": "https://azurlane.koumakan.jp/w/images/thumb/6/65/Atago.png/642px-Atago.png", - "background": "https://azurlane.koumakan.jp/w/images/3/3a/MainDayBG.png", - "chibi": "https://azurlane.koumakan.jp/w/images/3/33/AtagoChibi.png", - "info": { - "Obtained From": "Default", - "Live2D Model": "No" - } + { + "201": { + "wikiUrl": "https://azurlane.koumakan.jp/Atago", + "id": "201", + "names": { + "en": "Atago", + "code": "IJN Atago", + "cn": "犬", + "jp": "愛宕", + "kr": "아타고" }, - { - "name": "Oath", - "image": "https://azurlane.koumakan.jp/w/images/thumb/5/58/AtagoWedding.png/668px-AtagoWedding.png", - "background": "https://azurlane.koumakan.jp/w/images/3/3a/MainDayBG.png", - "chibi": "https://azurlane.koumakan.jp/w/images/1/1e/AtagoWeddingChibi.png", - "info": { - "EN Client": "Lily-White Vow", - "CN Client": "", - "JP Client": "White Promise", - "Obtained From": "Oath", - "Live2D Model": "No" - } + "class": "Takao", + "nationality": "Sakura Empire", + "hullType": "Heavy Cruiser", + "thumbnail": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/thumbnail.png", + "rarity": "Super Rare", + "stars": { + "stars": "★★★☆☆☆", + "value": 3 }, - { - "name": "Summer March", - "image": "https://azurlane.koumakan.jp/w/images/thumb/3/36/AtagoSummer.png/352px-AtagoSummer.png", - "background": "https://azurlane.koumakan.jp/w/images/1/1c/Skin_BG_106.png", - "chibi": "https://azurlane.koumakan.jp/w/images/0/01/AtagoSummerChibi.png", - "info": { - "EN Client": "Summer March", - "CN Client": "", - "JP Client": "Midsummer March", - "Obtained From": "Skin Shop", - "Cost": "700", - "Live2D Model": "Yes" + "stats": { + "level120": { + "health": "4295", + "armor": "Medium", + "reload": "175", + "luck": "48", + "firepower": "270", + "torpedo": "245", + "evasion": "79", + "speed": "31", + "antiair": "178", + "aviation": "0", + "oilConsumption": "12", + "accuracyHit": "134", + "antisubmarineWarfare": "0" + }, + "level100": { + "health": "3818", + "armor": "Medium", + "reload": "152", + "luck": "48", + "firepower": "236", + "torpedo": "213", + "evasion": "33", + "speed": "31", + "antiair": "155", + "aviation": "0", + "oilConsumption": "12", + "accuracyHit": "119", + "antisubmarineWarfare": "0" + }, + "baseStats": { + "health": "738", + "armor": "Medium", + "reload": "64", + "luck": "48", + "firepower": "50", + "torpedo": "45", + "evasion": "13", + "speed": "31", + "antiair": "33", + "aviation": "0", + "oilConsumption": "4", + "accuracyHit": "46", + "antisubmarineWarfare": "0" } }, - { - "name": "Hallmarks of Winter", - "image": "https://azurlane.koumakan.jp/w/images/thumb/4/4e/AtagoNew_Year.png/462px-AtagoNew_Year.png", - "background": "https://azurlane.koumakan.jp/w/images/5/5b/Skin_BG_101.png", - "chibi": "https://azurlane.koumakan.jp/w/images/8/8b/AtagoNew_YearChibi.png", - "info": { - "EN Client": "Hallmarks of Winter", - "CN Client": "", - "JP Client": "Features of Winter", - "Obtained From": "Skin Shop", - "Cost": "780", - "Live2D Model": "No" + "slots": { + "1": { + "type": "CA Guns", + "minEfficiency": 130, + "maxEfficiency": 135 + }, + "2": { + "type": "Torpedoes", + "minEfficiency": 145, + "maxEfficiency": 170 + }, + "3": { + "type": "Anti-Air Guns", + "minEfficiency": 100, + "maxEfficiency": 100 } }, - { - "name": "School Traumerei", - "image": "https://azurlane.koumakan.jp/w/images/thumb/9/96/AtagoSchool.png/448px-AtagoSchool.png", - "background": "https://azurlane.koumakan.jp/w/images/6/64/Skin_BG_103.png", - "chibi": "https://azurlane.koumakan.jp/w/images/4/49/AtagoSchoolChibi.png", - "info": { - "EN Client": "School Traumerei", - "CN Client": "", - "JP Client": "School Traumerei", - "Obtained From": "Skin Shop", - "Cost": "880", - "Live2D Model": "No" - } - } - ], - "buildTime": "02:05:00", - "rarity": "Super Rare", - "stars": { - "stars": "★★★☆☆☆", - "value": 3 - }, - "stats": { - "Level 120": { - "Health": "4295", - "Armor": "Medium", - "Reload": "175", - "Luck": "48", - "Firepower": "270", - "Torpedo": "245", - "Evasion": "79", - "Speed": "31", - "Anti-air": "178", - "Aviation": "0", - "Oil consumption": "12", - "Accuracy (Hit)": "134", - "Anti-submarine warfare": "0" + "enhanceValue": { + "firepower": 28, + "torpedo": 15, + "aviation": 0, + "reload": 12 }, - "Level 100": { - "Health": "3818", - "Armor": "Medium", - "Reload": "152", - "Luck": "48", - "Firepower": "236", - "Torpedo": "213", - "Evasion": "33", - "Speed": "31", - "Anti-air": "155", - "Aviation": "0", - "Oil consumption": "12", - "Accuracy (Hit)": "119", - "Anti-submarine warfare": "0" + "scrapValue": { + "coin": 9, + "oil": 3, + "medal": 10 }, - "Base Stats": { - "Health": "738", - "Armor": "Medium", - "Reload": "64", - "Luck": "48", - "Firepower": "50", - "Torpedo": "45", - "Evasion": "13", - "Speed": "31", - "Anti-air": "33", - "Aviation": "0", - "Oil consumption": "4", - "Accuracy (Hit)": "46", - "Anti-submarine warfare": "0" - } - }, - "misc": { - "artist": "木shiyo", - "web": { - "name": "木shiyo", - "url": "https://weibo.com/u/2481339344" + "skills": [ + { + "icon": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skills/arsonist.png", + "names": { + "en": "Arsonist", + "cn": "纵火狂魔", + "jp": "爆炎開放" + }, + "description": "Increases damage dealt with HE ammo by 5% (15%), Burn damage by 20% (50%), and chance to ignite with HE ammo by 4.5% (12%).", + "color": "pink" + }, + { + "icon": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skills/double_torpedo.png", + "names": { + "en": "Double Torpedo", + "cn": "鱼雷连射", + "jp": "次発装填" + }, + "description": "When launching a wave of torpedoes: 15% (30%) chance to launch another wave.", + "color": "pink" + }, + { + "icon": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skills/all_out_assault.png", + "names": { + "en": "All Out Assault", + "cn": "全弹发射", + "jp": "全弾発射-高雄型" + }, + "description": "Every 9 (6) shots from the main battery, triggers Full Barrage - Takao Class I (II).", + "color": "pink" + } + ], + "limitBreaks": [ + [ + "Gains Full Barrage I", + "Main Gun Efficiency +5%" + ], + [ + "Max Torpedo Capacity +1", + "Pre-Loaded Torpedo +1", + "Torpedo Efficiency +10%" + ], + [ + "Upgrades Full Barrage I→II", + "Torpedo Efficiency +15%" + ] + ], + "fleetTech": { + "statsBonus": { + "collection": { + "applicable": [ + "Heavy cruiser", + "Large cruiser", + "Monitor" + ], + "stat": "Health", + "bonus": "+1" + }, + "maxLevel": { + "applicable": [ + "Heavy cruiser", + "Large cruiser", + "Monitor" + ], + "stat": "Torpedo", + "bonus": "+1" + } + }, + "techPoints": { + "collection": 14, + "maxLimitBreak": 28, + "maxLevel": 21, + "total": 63 + } }, - "pixiv": { - "name": "木shiyo", - "url": "https://www.pixiv.net/member.php?id=40222" + "construction": { + "constructionTime": "02:05:00", + "availableIn": { + "light": false, + "heavy": true, + "aviation": true, + "limited": false, + "exchange": false + } }, - "twitter": { - "name": "木shiyo", - "url": "https://twitter.com/kishiyo1943" + "gallery": [ + { + "description": "Loading Screen featuring Takao, Atago, Akagi, and Kaga in a winter setting", + "url": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/gallery/Bg_takao_1.png" + }, + { + "description": "Monarch, Atago, Takao, and Emile Bertin in the hot springs", + "url": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/gallery/Bg_bath.png" + }, + { + "description": "Loading Screen featuring Atago during valentines", + "url": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/gallery/Bg_valentines_3.png" + }, + { + "description": "Takao and Atago after making chocolates", + "url": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/gallery/Bg_valentines_5.png" + }, + { + "description": "Taihou, Formidable, Bismarck, Roon, Tirpitz, Kaga, Amagi, Cleveland, Atago and Essex during Halloween", + "url": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/gallery/Bg_2019.10.31_5.png" + } + ], + "misc": { + "artist": "木shiyo", + "web": { + "name": "木shiyo", + "url": "https://weibo.com/u/2481339344" + }, + "pixiv": { + "name": "木shiyo", + "url": "https://www.pixiv.net/member.php?id=40222" + }, + "twitter": { + "name": "木shiyo", + "url": "https://twitter.com/kishiyo1943" + }, + "voice": { + "name": "Ai Kayano", + "url": "https://en.wikipedia.org/wiki/Ai_Kayano" + } }, - "voice": "Ai Kayano" + "skins": [ + { + "name": "Default", + "image": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Default/image.png", + "background": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/MainDayBG.png", + "chibi": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Default/chibi.png", + "info": { + "obtainedFrom": "Default", + "live2DModel": false + } + }, + { + "name": "Oath", + "image": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Oath/image.png", + "background": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/MainDayBG.png", + "chibi": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Oath/chibi.png", + "info": { + "enClient": "Lily-White Vow", + "cnClient": "白花的誓言", + "jpClient": "白き約束", + "obtainedFrom": "Oath", + "live2DModel": false + } + }, + { + "name": "Summer March", + "image": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Summer_March/image.png", + "background": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/Skin_BG_106.png", + "chibi": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Summer_March/chibi.png", + "info": { + "enClient": "Summer March", + "cnClient": "盛夏进行曲", + "jpClient": "真夏の行進曲", + "obtainedFrom": "Skin Shop", + "cost": 700, + "live2DModel": true + } + }, + { + "name": "Hallmarks of Winter", + "image": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Hallmarks_of_Winter/image.png", + "background": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/Skin_BG_101.png", + "chibi": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Hallmarks_of_Winter/chibi.png", + "info": { + "enClient": "Hallmarks of Winter", + "cnClient": "冬季风物诗", + "jpClient": "冬の風物詩", + "obtainedFrom": "Skin Shop", + "cost": 780, + "live2DModel": false + } + }, + { + "name": "School Traumerei", + "image": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/School_Traumerei/image.png", + "background": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/Skin_BG_103.png", + "chibi": "https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/School_Traumerei/chibi.png", + "info": { + "enClient": "School Traumerei", + "cnClient": "学园幻想曲", + "jpClient": "学園トロイメライ", + "obtainedFrom": "Skin Shop", + "cost": 880, + "live2DModel": false + } + } + ] } - }} + } """.trimIndent()) val atago = ShipParser.jsonToShip(json.optJSONObject("201"), "201") atago.wikiUrl.shouldBe("https://azurlane.koumakan.jp/Atago") atago.id.shouldBe("201") atago.names.en.shouldBe("Atago") - atago.names.cn.shouldBe("爱宕") + atago.names.cn.shouldBe("犬") atago.names.jp.shouldBe("愛宕") atago.names.kr.shouldBe("아타고") atago.shipClass.shouldBe("Takao") atago.nationality.shouldBe("Sakura Empire") atago.hullType.shouldBe("Heavy Cruiser") - atago.thumbnail.shouldBe("https://azurlane.koumakan.jp/w/images/0/0c/AtagoIcon.png") + atago.thumbnail.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/thumbnail.png") atago.skins.shouldHaveSize(5) atago.skins[0].name.shouldBe("Default") - atago.skins[0].image.shouldBe("https://azurlane.koumakan.jp/w/images/thumb/6/65/Atago.png/642px-Atago.png") - atago.skins[0].background.shouldBe("https://azurlane.koumakan.jp/w/images/3/3a/MainDayBG.png") - atago.skins[0].chibi.shouldBe("https://azurlane.koumakan.jp/w/images/3/33/AtagoChibi.png") + atago.skins[0].image.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Default/image.png") + atago.skins[0].background.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/MainDayBG.png") + atago.skins[0].chibi.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Default/chibi.png") atago.skins[0].info.shouldNotBeNull() atago.skins[0].info!!.enClient.shouldBeEmpty() atago.skins[0].info!!.cnClient.shouldBeEmpty() @@ -192,54 +332,59 @@ class ShipParserTestCase: StringSpec() { atago.skins[0].info!!.obtainedFrom.shouldBe("Default") atago.skins[0].info!!.isLive2D.shouldBeFalse() atago.skins[1].name.shouldBe("Oath") - atago.skins[1].image.shouldBe("https://azurlane.koumakan.jp/w/images/thumb/5/58/AtagoWedding.png/668px-AtagoWedding.png") - atago.skins[1].background.shouldBe("https://azurlane.koumakan.jp/w/images/3/3a/MainDayBG.png") - atago.skins[1].chibi.shouldBe("https://azurlane.koumakan.jp/w/images/1/1e/AtagoWeddingChibi.png") + atago.skins[1].image.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Oath/image.png") + atago.skins[1].background.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/MainDayBG.png") + atago.skins[1].chibi.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Oath/chibi.png") atago.skins[1].info.shouldNotBeNull() atago.skins[1].info!!.enClient.shouldBe("Lily-White Vow") - atago.skins[1].info!!.cnClient.shouldBeEmpty() - atago.skins[1].info!!.jpClient.shouldBe("White Promise") + atago.skins[1].info!!.cnClient.shouldBe("白花的誓言") + atago.skins[1].info!!.jpClient.shouldBe("白き約束") atago.skins[1].info!!.cost.shouldBe(0) atago.skins[1].info!!.obtainedFrom.shouldBe("Oath") atago.skins[1].info!!.isLive2D.shouldBeFalse() atago.skins[2].name.shouldBe("Summer March") - atago.skins[2].image.shouldBe("https://azurlane.koumakan.jp/w/images/thumb/3/36/AtagoSummer.png/352px-AtagoSummer.png") - atago.skins[2].background.shouldBe("https://azurlane.koumakan.jp/w/images/1/1c/Skin_BG_106.png") - atago.skins[2].chibi.shouldBe("https://azurlane.koumakan.jp/w/images/0/01/AtagoSummerChibi.png") + atago.skins[2].image.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Summer_March/image.png") + atago.skins[2].background.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/Skin_BG_106.png") + atago.skins[2].chibi.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Summer_March/chibi.png") atago.skins[2].info.shouldNotBeNull() atago.skins[2].info!!.enClient.shouldBe("Summer March") - atago.skins[2].info!!.cnClient.shouldBe("") - atago.skins[2].info!!.jpClient.shouldBe("Midsummer March") + atago.skins[2].info!!.cnClient.shouldBe("盛夏进行曲") + atago.skins[2].info!!.jpClient.shouldBe("真夏の行進曲") atago.skins[2].info!!.cost.shouldBe(700) atago.skins[2].info!!.obtainedFrom.shouldBe("Skin Shop") atago.skins[2].info!!.isLive2D.shouldBeTrue() atago.skins[3].name.shouldBe("Hallmarks of Winter") - atago.skins[3].image.shouldBe("https://azurlane.koumakan.jp/w/images/thumb/4/4e/AtagoNew_Year.png/462px-AtagoNew_Year.png") - atago.skins[3].background.shouldBe("https://azurlane.koumakan.jp/w/images/5/5b/Skin_BG_101.png") - atago.skins[3].chibi.shouldBe("https://azurlane.koumakan.jp/w/images/8/8b/AtagoNew_YearChibi.png") + atago.skins[3].image.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Hallmarks_of_Winter/image.png") + atago.skins[3].background.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/Skin_BG_101.png") + atago.skins[3].chibi.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/Hallmarks_of_Winter/chibi.png") atago.skins[3].info.shouldNotBeNull() atago.skins[3].info!!.enClient.shouldBe("Hallmarks of Winter") - atago.skins[3].info!!.cnClient.shouldBeEmpty() - atago.skins[3].info!!.jpClient.shouldBe("Features of Winter") + atago.skins[3].info!!.cnClient.shouldBe("冬季风物诗") + atago.skins[3].info!!.jpClient.shouldBe("冬の風物詩") atago.skins[3].info!!.cost.shouldBe(780) atago.skins[3].info!!.obtainedFrom.shouldBe("Skin Shop") atago.skins[3].info!!.isLive2D.shouldBeFalse() atago.skins[4].name.shouldBe("School Traumerei") - atago.skins[4].image.shouldBe("https://azurlane.koumakan.jp/w/images/thumb/9/96/AtagoSchool.png/448px-AtagoSchool.png") - atago.skins[4].background.shouldBe("https://azurlane.koumakan.jp/w/images/6/64/Skin_BG_103.png") - atago.skins[4].chibi.shouldBe("https://azurlane.koumakan.jp/w/images/4/49/AtagoSchoolChibi.png") + atago.skins[4].image.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/School_Traumerei/image.png") + atago.skins[4].background.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/backgrounds/Skin_BG_103.png") + atago.skins[4].chibi.shouldBe("https://raw.githubusercontent.com/AzurAPI/azurapi-js-setup/master/images/skins/201/School_Traumerei/chibi.png") atago.skins[4].info.shouldNotBeNull() atago.skins[4].info!!.enClient.shouldBe("School Traumerei") - atago.skins[4].info!!.cnClient.shouldBeEmpty() - atago.skins[4].info!!.jpClient.shouldBe("School Traumerei") + atago.skins[4].info!!.cnClient.shouldBe("学园幻想曲") + atago.skins[4].info!!.jpClient.shouldBe("学園トロイメライ") atago.skins[4].info!!.cost.shouldBe(880) atago.skins[4].info!!.obtainedFrom.shouldBe("Skin Shop") atago.skins[4].info!!.isLive2D.shouldBeFalse() - atago.buildTime.shouldBe("02:05:00") + atago.construction!!.constructionTime.shouldBe("02:05:00") + atago.construction!!.light.shouldBeFalse() + atago.construction!!.heavy.shouldBeTrue() + atago.construction!!.aviation.shouldBeTrue() + atago.construction!!.limited.shouldBeFalse() + atago.construction!!.exchange.shouldBeFalse() atago.rarity.shouldBe("Super Rare") atago.stars!!.stars.shouldBe("★★★☆☆☆") @@ -294,7 +439,8 @@ class ShipParserTestCase: StringSpec() { atago.misc!!.pixiv!!.url.shouldBe("https://www.pixiv.net/member.php?id=40222") atago.misc!!.twitter!!.name.shouldBe("木shiyo") atago.misc!!.twitter!!.url.shouldBe("https://twitter.com/kishiyo1943") - atago.misc!!.voice.shouldBe("Ai Kayano") + atago.misc!!.voice!!.name.shouldBe("Ai Kayano") + atago.misc!!.voice!!.url.shouldBe("https://en.wikipedia.org/wiki/Ai_Kayano") } } } \ No newline at end of file