[F] Fix test case asset path

This commit is contained in:
Azalea
2026-08-04 21:03:56 +00:00
parent 28eacf9138
commit 87f4c99940
9 changed files with 67 additions and 5 deletions
+59 -5
View File
@@ -15,16 +15,70 @@ import icu.samnyan.aqua.sega.ongeki.model.UserPlaylog as OngekiUserPlaylog
import icu.samnyan.aqua.sega.util.BASIC_MAPPER
import icu.samnyan.aqua.sega.util.STRING_MAPPER
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import tools.jackson.databind.json.JsonMapper
import tools.jackson.module.kotlin.KotlinModule
import java.io.File
class ReproduceIssueTest {
private fun loadResourceJson(path: String): String {
return javaClass.getResourceAsStream(path)?.bufferedReader()?.use { it.readText() }
?: error("Test resource $path not found")
}
@Test
fun testMai2ExportSerializationAgainstBaseline() {
fun testObjectMapperWithoutKotlinModule() {
val mai2Playlog = Mai2UserPlaylog().apply {
musicId = 11479
level = 2
achievement = 1000000
deluxscore = 2000
isClear = true
isTap = true
isHold = true
isSlide = true
isTouch = true
isBreak = true
isCriticalDisp = true
isFastLateDisp = true
isAchieveNewRecord = true
isDeluxscoreNewRecord = true
isPlayTutorial = true
isEventMode = false
isFreedomMode = false
isNewFree = true
}
val mai2Map = Mai2UserMap().apply {
mapId = 1
distance = 100
isLock = false
isClear = true
isComplete = true
}
val mai2Export = Maimai2DataExport().apply {
userData = Mai2UserDetail().apply { userName = "TestUser" }
userPlaylogList = listOf(mai2Playlog)
userMapList = listOf(mai2Map)
}
// Standard Jackson 2 ObjectMapper() without KotlinModule strips 'is' getters:
val plainObjectMapper = ObjectMapper()
val plainJson = plainObjectMapper.writeValueAsString(mai2Export)
val plainTree = plainObjectMapper.readTree(plainJson)
val plainPlaylogNode = plainTree.at("/userPlaylogList/0")
assertTrue(plainPlaylogNode.has("clear"), "Plain ObjectMapper has 'clear' instead of 'isClear'")
assertTrue(plainPlaylogNode.has("fullCombo"), "Plain ObjectMapper has 'fullCombo' instead of 'isFullCombo'")
assertTrue(plainPlaylogNode.has("allPerfect"), "Plain ObjectMapper has 'allPerfect' instead of 'isAllPerfect'")
assertFalse(plainPlaylogNode.has("isClear"), "Plain ObjectMapper is missing 'isClear'")
}
@Test
fun testMai2ExportSerializationAgainstBaselineResource() {
val mai2Playlog = Mai2UserPlaylog().apply {
musicId = 11479
level = 2
@@ -61,7 +115,7 @@ class ReproduceIssueTest {
}
val currentJson = JACKSON.writeValueAsString(mai2Export)
val baselineJson = File("/tmp/saved_jsons/mai2_export_web.json").readText()
val baselineJson = loadResourceJson("/json/mai2_export_web.json")
val currentTree = JACKSON.readTree(currentJson)
val baselineTree = JACKSON.readTree(baselineJson)
@@ -79,7 +133,7 @@ class ReproduceIssueTest {
}
@Test
fun testChu3ExportSerializationAgainstBaseline() {
fun testChu3ExportSerializationAgainstBaselineResource() {
val chu3Playlog = Chu3UserPlaylog().apply {
musicId = 100
level = 1
@@ -95,7 +149,7 @@ class ReproduceIssueTest {
}
val currentJson = JACKSON.writeValueAsString(chu3Export)
val baselineJson = File("/tmp/saved_jsons/chu3_export_web.json").readText()
val baselineJson = loadResourceJson("/json/chu3_export_web.json")
val currentTree = JACKSON.readTree(currentJson)
val baselineTree = JACKSON.readTree(baselineJson)
@@ -0,0 +1 @@
{"gameId":"SDHD","userData":{"userName":"ChuUser","level":0,"reincarnationNum":0,"exp":"","point":0,"totalPoint":0,"playCount":0,"multiPlayCount":0,"playerRating":0,"highestRating":0,"nameplateId":0,"frameId":0,"characterId":0,"mateId":0,"trophyId":0,"playedTutorialBit":0,"firstTutorialCancelNum":0,"masterTutorialCancelNum":0,"totalMapNum":0,"totalHiScore":0,"totalBasicHighScore":0,"totalAdvancedHighScore":0,"totalExpertHighScore":0,"totalMasterHighScore":0,"totalUltimaHighScore":0,"eventWatchedDate":[2026,8,4,20,55,25,79881752],"friendCount":0,"firstGameId":"","firstRomVersion":"","firstDataVersion":"","firstPlayDate":[2026,8,4,20,55,25,79890738],"lastGameId":"","lastRomVersion":"","lastDataVersion":"","lastPlayDate":[2026,8,4,20,55,25,79901128],"lastPlaceId":0,"lastPlaceName":"","lastRegionId":"","lastRegionName":"","lastAllNetId":"","lastCountryCode":"","userNameEx":"","compatibleCmVersion":"","medal":0,"mapIconId":0,"voiceId":0,"avatarWear":0,"avatarHead":0,"avatarFace":0,"avatarSkin":0,"avatarItem":0,"avatarFront":0,"avatarBack":0,"classEmblemBase":0,"classEmblemMedal":0,"stockedGridCount":0,"exMapLoopCount":0,"netBattlePlayCount":0,"netBattleWinCount":0,"netBattleLoseCount":0,"netBattleConsecutiveWinCount":0,"charaIllustId":0,"skillId":0,"stageId":0,"overPowerPoint":0,"overPowerRate":0,"overPowerLowerRank":0,"avatarPoint":0,"battleRankId":0,"battleRankPoint":0,"eliteRankPoint":0,"netBattle1stCount":0,"netBattle2ndCount":0,"netBattle3rdCount":0,"netBattle4thCount":0,"netBattleCorrection":0,"netBattleErrCnt":0,"netBattleHostErrCnt":0,"battleRewardStatus":0,"battleRewardIndex":0,"battleRewardCount":0,"ext1":0,"ext2":0,"ext3":0,"ext4":0,"ext5":0,"ext6":0,"ext7":0,"ext8":0,"ext9":0,"ext10":0,"extStr1":"","extStr2":"","extLong1":0,"extLong2":0,"rankUpChallengeResults":null,"netBattleEndState":0,"trophyIdSub1":0,"trophyIdSub2":0,"totalScore":0,"isNetBattleHost":false},"userGameOption":{"bgInfo":0,"fieldColor":0,"guideSound":0,"soundEffect":0,"guideLine":0,"speed":0,"optionSet":0,"matching":0,"judgePos":0,"rating":0,"judgeCritical":0,"judgeJustice":0,"judgeAttack":0,"headphone":0,"playerLevel":0,"successTap":0,"successExTap":0,"successSlideHold":0,"successAir":0,"successFlick":0,"successSkill":0,"successTapTimbre":0,"privacy":0,"mirrorFumen":0,"selectMusicFilterLv":0,"sortMusicFilterLv":0,"sortMusicGenre":0,"categoryDetail":0,"judgeTimingOffset":0,"playTimingOffset":0,"fieldWallPosition":0,"resultVoiceShort":0,"notesThickness":0,"judgeAppendSe":0,"trackSkip":0,"hardJudge":0,"speed_120":0,"fieldWallPosition_120":0,"playTimingOffset_120":0,"judgeTimingOffset_120":0,"ext1":0,"ext2":0,"ext3":0,"ext4":0,"ext5":0,"ext6":0,"ext7":0,"ext8":0,"ext9":0,"ext10":0},"userActivityList":[],"userCharacterList":[],"userChargeList":[],"userCourseList":[],"userDuelList":[],"userItemList":[],"userMapList":[],"userMusicDetailList":[],"userPlaylogList":[{"orderId":0,"sortNumber":0,"placeId":0,"userPlayDate":[2026,8,4,20,55,25,77926936],"musicId":100,"level":1,"customId":0,"playedUserId1":0,"playedUserId2":0,"playedUserId3":0,"playedMusicLevel1":0,"playedMusicLevel2":0,"playedMusicLevel3":0,"playedCustom1":0,"playedCustom2":0,"playedCustom3":0,"track":0,"score":1000000,"rank":0,"maxCombo":0,"maxChain":0,"rateTap":0,"rateHold":0,"rateSlide":0,"rateAir":0,"rateFlick":0,"judgeGuilty":0,"judgeAttack":0,"judgeJustice":0,"judgeCritical":0,"judgeHeaven":0,"eventId":0,"playerRating":0,"fullChainKind":0,"characterId":0,"charaIllustId":0,"skillId":0,"playKind":0,"skillLevel":0,"skillEffect":0,"commonId":0,"regionId":0,"machineType":0,"ticketId":0,"achievement":1000000,"beforeRating":0,"afterRating":0,"isAllPerfect":true,"isNewRecord":false,"isFullCombo":true,"isAllJustice":true,"isContinue":false,"isFreeToPlay":false,"isClear":true}],"userMateList":[],"userGeneralDataList":[],"userMiscList":{"recentNbSelect":[],"recentNbMusic":[],"favMusic":[]}}
@@ -0,0 +1 @@
{"orderId":0,"sortNumber":0,"placeId":0,"userPlayDate":[2026,8,4,20,55,25,77926936],"musicId":100,"level":1,"customId":0,"playedUserId1":0,"playedUserId2":0,"playedUserId3":0,"playedMusicLevel1":0,"playedMusicLevel2":0,"playedMusicLevel3":0,"playedCustom1":0,"playedCustom2":0,"playedCustom3":0,"track":0,"score":1000000,"rank":0,"maxCombo":0,"maxChain":0,"rateTap":0,"rateHold":0,"rateSlide":0,"rateAir":0,"rateFlick":0,"judgeGuilty":0,"judgeAttack":0,"judgeJustice":0,"judgeCritical":0,"judgeHeaven":0,"eventId":0,"playerRating":0,"fullChainKind":0,"characterId":0,"charaIllustId":0,"skillId":0,"playKind":0,"skillLevel":0,"skillEffect":0,"commonId":0,"regionId":0,"machineType":0,"ticketId":0,"achievement":1000000,"beforeRating":0,"afterRating":0,"isAllPerfect":true,"isNewRecord":false,"isFullCombo":true,"isAllJustice":true,"isContinue":false,"isFreeToPlay":false,"isClear":true}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"orderId":0,"playlogId":0,"version":0,"placeId":0,"placeName":"","loginDate":0,"playDate":"","userPlayDate":"","type":0,"musicId":11479,"level":2,"trackNo":0,"vsMode":0,"vsUserName":"","vsStatus":0,"vsUserRating":0,"vsUserAchievement":0,"vsUserGradeRank":0,"vsRank":0,"playerNum":0,"playedUserId1":0,"playedUserName1":"","playedMusicLevel1":0,"playedUserId2":0,"playedUserName2":"","playedMusicLevel2":0,"playedUserId3":0,"playedUserName3":"","playedMusicLevel3":0,"characterId1":0,"characterLevel1":0,"characterAwakening1":0,"characterId2":0,"characterLevel2":0,"characterAwakening2":0,"characterId3":0,"characterLevel3":0,"characterAwakening3":0,"characterId4":0,"characterLevel4":0,"characterAwakening4":0,"characterId5":0,"characterLevel5":0,"characterAwakening5":0,"achievement":1000000,"deluxscore":2000,"scoreRank":0,"maxCombo":0,"totalCombo":0,"maxSync":0,"totalSync":0,"tapCriticalPerfect":0,"tapPerfect":0,"tapGreat":0,"tapGood":0,"tapMiss":0,"holdCriticalPerfect":0,"holdPerfect":0,"holdGreat":0,"holdGood":0,"holdMiss":0,"slideCriticalPerfect":0,"slidePerfect":0,"slideGreat":0,"slideGood":0,"slideMiss":0,"touchCriticalPerfect":0,"touchPerfect":0,"touchGreat":0,"touchGood":0,"touchMiss":0,"breakCriticalPerfect":0,"breakPerfect":0,"breakGreat":0,"breakGood":0,"breakMiss":0,"isTap":true,"isHold":true,"isSlide":true,"isTouch":true,"isBreak":true,"isCriticalDisp":true,"isFastLateDisp":true,"fastCount":0,"lateCount":0,"isAchieveNewRecord":true,"isDeluxscoreNewRecord":true,"comboStatus":0,"syncStatus":0,"isClear":true,"beforeRating":0,"afterRating":0,"beforeGrade":0,"afterGrade":0,"afterGradeRank":0,"beforeDeluxRating":0,"afterDeluxRating":0,"isPlayTutorial":true,"isEventMode":false,"isFreedomMode":false,"playMode":0,"isNewFree":true,"trialPlayAchievement":0,"extNum1":0,"extNum2":0,"extNum4":0,"extBool1":false,"extBool2":false,"extBool3":false,"isFullCombo":true,"isAllPerfect":true}
@@ -0,0 +1 @@
{"orderId":0,"playlogId":0,"version":0,"placeId":0,"placeName":"","loginDate":0,"playDate":"","userPlayDate":"","type":0,"musicId":11479,"level":2,"trackNo":0,"vsMode":0,"vsUserName":"","vsStatus":0,"vsUserRating":0,"vsUserAchievement":0,"vsUserGradeRank":0,"vsRank":0,"playerNum":0,"playedUserId1":0,"playedUserName1":"","playedMusicLevel1":0,"playedUserId2":0,"playedUserName2":"","playedMusicLevel2":0,"playedUserId3":0,"playedUserName3":"","playedMusicLevel3":0,"characterId1":0,"characterLevel1":0,"characterAwakening1":0,"characterId2":0,"characterLevel2":0,"characterAwakening2":0,"characterId3":0,"characterLevel3":0,"characterAwakening3":0,"characterId4":0,"characterLevel4":0,"characterAwakening4":0,"characterId5":0,"characterLevel5":0,"characterAwakening5":0,"achievement":1000000,"deluxscore":2000,"scoreRank":0,"maxCombo":0,"totalCombo":0,"maxSync":0,"totalSync":0,"tapCriticalPerfect":0,"tapPerfect":0,"tapGreat":0,"tapGood":0,"tapMiss":0,"holdCriticalPerfect":0,"holdPerfect":0,"holdGreat":0,"holdGood":0,"holdMiss":0,"slideCriticalPerfect":0,"slidePerfect":0,"slideGreat":0,"slideGood":0,"slideMiss":0,"touchCriticalPerfect":0,"touchPerfect":0,"touchGreat":0,"touchGood":0,"touchMiss":0,"breakCriticalPerfect":0,"breakPerfect":0,"breakGreat":0,"breakGood":0,"breakMiss":0,"isTap":true,"isHold":true,"isSlide":true,"isTouch":true,"isBreak":true,"isCriticalDisp":true,"isFastLateDisp":true,"fastCount":0,"lateCount":0,"isAchieveNewRecord":true,"isDeluxscoreNewRecord":true,"comboStatus":0,"syncStatus":0,"isClear":true,"beforeRating":0,"afterRating":0,"beforeGrade":0,"afterGrade":0,"afterGradeRank":0,"beforeDeluxRating":0,"afterDeluxRating":0,"isPlayTutorial":true,"isEventMode":false,"isFreedomMode":false,"playMode":0,"isNewFree":true,"trialPlayAchievement":0,"extNum1":0,"extNum2":0,"extNum4":0,"extBool1":false,"extBool2":false,"extBool3":false,"isFullCombo":true,"isAllPerfect":true}
@@ -0,0 +1 @@
{"orderId":"0","playlogId":"0","version":"0","placeId":"0","placeName":"","loginDate":"0","playDate":"","userPlayDate":"","type":"0","musicId":"11479","level":"2","trackNo":"0","vsMode":"0","vsUserName":"","vsStatus":"0","vsUserRating":"0","vsUserAchievement":"0","vsUserGradeRank":"0","vsRank":"0","playerNum":"0","playedUserId1":"0","playedUserName1":"","playedMusicLevel1":"0","playedUserId2":"0","playedUserName2":"","playedMusicLevel2":"0","playedUserId3":"0","playedUserName3":"","playedMusicLevel3":"0","characterId1":"0","characterLevel1":"0","characterAwakening1":"0","characterId2":"0","characterLevel2":"0","characterAwakening2":"0","characterId3":"0","characterLevel3":"0","characterAwakening3":"0","characterId4":"0","characterLevel4":"0","characterAwakening4":"0","characterId5":"0","characterLevel5":"0","characterAwakening5":"0","achievement":"1000000","deluxscore":"2000","scoreRank":"0","maxCombo":"0","totalCombo":"0","maxSync":"0","totalSync":"0","tapCriticalPerfect":"0","tapPerfect":"0","tapGreat":"0","tapGood":"0","tapMiss":"0","holdCriticalPerfect":"0","holdPerfect":"0","holdGreat":"0","holdGood":"0","holdMiss":"0","slideCriticalPerfect":"0","slidePerfect":"0","slideGreat":"0","slideGood":"0","slideMiss":"0","touchCriticalPerfect":"0","touchPerfect":"0","touchGreat":"0","touchGood":"0","touchMiss":"0","breakCriticalPerfect":"0","breakPerfect":"0","breakGreat":"0","breakGood":"0","breakMiss":"0","isTap":"true","isHold":"true","isSlide":"true","isTouch":"true","isBreak":"true","isCriticalDisp":"true","isFastLateDisp":"true","fastCount":"0","lateCount":"0","isAchieveNewRecord":"true","isDeluxscoreNewRecord":"true","comboStatus":"0","syncStatus":"0","isClear":"true","beforeRating":"0","afterRating":"0","beforeGrade":"0","afterGrade":"0","afterGradeRank":"0","beforeDeluxRating":"0","afterDeluxRating":"0","isPlayTutorial":"true","isEventMode":"false","isFreedomMode":"false","playMode":"0","isNewFree":"true","trialPlayAchievement":"0","extNum1":"0","extNum2":"0","extNum4":"0","extBool1":"false","extBool2":"false","extBool3":"false","isFullCombo":"true","isAllPerfect":"true"}
@@ -0,0 +1 @@
{"gameId":"SDDT","userData":{"userName":"OngekiUser","level":0,"reincarnationNum":0,"exp":0,"point":0,"totalPoint":0,"playCount":0,"jewelCount":0,"totalJewelCount":0,"medalCount":0,"playerRating":0,"highestRating":0,"battlePoint":0,"bestBattlePoint":0,"overDamageBattlePoint":0,"isDialogWatchedSuggestMemory":false,"nameplateId":0,"trophyId":0,"cardId":0,"characterId":0,"characterVoiceNo":0,"tabSetting":0,"tabSortSetting":0,"cardCategorySetting":0,"cardSortSetting":0,"rivalScoreCategorySetting":0,"playedTutorialBit":0,"firstTutorialCancelNum":0,"sumTechHighScore":0,"sumTechBasicHighScore":0,"sumTechAdvancedHighScore":0,"sumTechExpertHighScore":0,"sumTechMasterHighScore":0,"sumTechLunaticHighScore":0,"sumBattleHighScore":0,"sumBattleBasicHighScore":0,"sumBattleAdvancedHighScore":0,"sumBattleExpertHighScore":0,"sumBattleMasterHighScore":0,"sumBattleLunaticHighScore":0,"eventWatchedDate":"","cmEventWatchedDate":"","firstGameId":"","firstRomVersion":"","firstDataVersion":"","firstPlayDate":"","lastGameId":"","lastRomVersion":"","lastDataVersion":"","compatibleCmVersion":"","lastPlayDate":"","lastPlaceId":0,"lastPlaceName":"","lastRegionId":0,"lastRegionName":"","lastAllNetId":0,"lastUsedDeckId":0,"lastPlayMusicLevel":0,"lastEmoneyBrand":0,"shizukuCount":0,"newPlayerRating":0,"newHighestRating":0,"sumPlatinumScoreStar":0,"sumBasicPlatinumScoreStar":0,"sumAdvancedPlatinumScoreStar":0,"sumExpertPlatinumScoreStar":0,"sumMasterPlatinumScoreStar":0,"sumLunaticPlatinumScoreStar":0,"totalScore":0},"userActivityList":[],"userBossList":[],"userCardList":[],"userChapterList":[],"userCharacterList":[],"userDeckList":[],"userEventMusicList":[],"userEventPointList":[],"userGeneralDataList":[],"userItemList":[],"userKopList":[],"userLoginBonusList":[],"userMemoryChapterList":[],"userMissionPointList":[],"userMusicDetailList":[],"userMusicItemList":[],"userOption":{"optionSet":0,"speed":0,"mirror":0,"judgeTiming":0,"judgeAdjustment":0,"abort":0,"stealthField":0,"tapSound":0,"volGuide":0,"volAll":0,"volTap":0,"volCrTap":0,"volHold":0,"volSide":0,"volFlick":0,"volBell":0,"volEnemy":0,"volSkill":0,"volDamage":0,"colorField":0,"colorLaneBright":0,"colorWallBright":0,"colorLane":0,"colorSide":0,"effectDamage":0,"effectPos":0,"judgeDisp":0,"judgePos":0,"judgeBreak":0,"judgeHit":0,"platinumBreakDisp":0,"judgeCriticalBreak":0,"matching":0,"dispPlayerLv":0,"dispRating":0,"dispBP":0,"headphone":0,"effectAttack":0},"userPlaylogList":[{"sortNumber":0,"placeId":0,"placeName":"","playDate":"","userPlayDate":"","musicId":200,"level":1,"playKind":0,"eventId":0,"eventName":"","eventPoint":0,"playedUserId1":0,"playedUserId2":0,"playedUserId3":0,"playedUserName1":"","playedUserName2":"","playedUserName3":"","playedMusicLevel1":0,"playedMusicLevel2":0,"playedMusicLevel3":0,"cardId1":0,"cardId2":0,"cardId3":0,"cardLevel1":0,"cardLevel2":0,"cardLevel3":0,"cardAttack1":0,"cardAttack2":0,"cardAttack3":0,"bossCharaId":0,"bossLevel":0,"bossAttribute":0,"clearStatus":0,"techScore":1000000,"techScoreRank":0,"battleScore":0,"battleScoreRank":0,"platinumScore":0,"maxCombo":0,"judgeMiss":0,"judgeHit":0,"judgeBreak":0,"judgeCriticalBreak":0,"rateTap":0,"rateHold":0,"rateFlick":0,"rateSideTap":0,"rateSideHold":0,"bellCount":0,"totalBellCount":0,"damageCount":0,"overDamage":0,"isTechNewRecord":false,"isBattleNewRecord":false,"isOverDamageNewRecord":false,"isFullCombo":true,"isFullBell":true,"isAllBreak":true,"playerRating":0,"battlePoint":0,"achievement":1000000,"beforeRating":0,"afterRating":0,"isAllPerfect":true}],"userRivalList":[],"userScenarioList":[],"userStoryList":[],"userTechCountList":[],"userTechEventList":[],"userTradeItemList":[],"userTrainingRoomList":[],"userEventMapList":[],"userSkinList":[],"userRegionsList":[],"userGachaList":[]}
@@ -0,0 +1 @@
{"sortNumber":0,"placeId":0,"placeName":"","playDate":"","userPlayDate":"","musicId":200,"level":1,"playKind":0,"eventId":0,"eventName":"","eventPoint":0,"playedUserId1":0,"playedUserId2":0,"playedUserId3":0,"playedUserName1":"","playedUserName2":"","playedUserName3":"","playedMusicLevel1":0,"playedMusicLevel2":0,"playedMusicLevel3":0,"cardId1":0,"cardId2":0,"cardId3":0,"cardLevel1":0,"cardLevel2":0,"cardLevel3":0,"cardAttack1":0,"cardAttack2":0,"cardAttack3":0,"bossCharaId":0,"bossLevel":0,"bossAttribute":0,"clearStatus":0,"techScore":1000000,"techScoreRank":0,"battleScore":0,"battleScoreRank":0,"platinumScore":0,"maxCombo":0,"judgeMiss":0,"judgeHit":0,"judgeBreak":0,"judgeCriticalBreak":0,"rateTap":0,"rateHold":0,"rateFlick":0,"rateSideTap":0,"rateSideHold":0,"bellCount":0,"totalBellCount":0,"damageCount":0,"overDamage":0,"isTechNewRecord":false,"isBattleNewRecord":false,"isOverDamageNewRecord":false,"isFullCombo":true,"isFullBell":true,"isAllBreak":true,"playerRating":0,"battlePoint":0,"achievement":1000000,"beforeRating":0,"afterRating":0,"isAllPerfect":true}