OSDN Git Service

Swift4.2にコンパート
[kcd/KCD.git] / KCDTests / SakutekiTest.swift
1 //
2 //  SakutekiTest.swift
3 //  KCDTests
4 //
5 //  Created by Hori,Masaki on 2017/12/24.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import XCTest
10
11 @testable import KCD
12
13 class SakutekiTest: XCTestCase {
14     
15     let store = ServerDataStore.oneTimeEditor()
16     
17     override func setUp() {
18         
19         super.setUp()
20         
21         // 千歳航改二
22         // 天山一二型(村田隊), 流星(六○一空),彩雲(東カロリン空),零式艦戦53型(岩本隊)
23         // Bofors 40mm四連装機関砲
24         setupShip(id: 228, slotItems: [36_082, 28_114, 67_268, 17_930], exSlot: 51_387, saku0: 108)
25         
26         // 熊野改二
27         // 紫雲, 零式水上偵察機11型乙, 強風改, 二式水戦改
28         // なし
29         setupShip(id: 4_184, slotItems: [65_505, 72_413, 70_952, 69_442], exSlot: 0, saku0: 110)
30         
31         // 筑摩改二
32         // 二式水戦改, 32号対水上電探+8, FuMO25レーダー, 零式水上観測機+6
33         // なし
34         setupShip(id: 220, slotItems: [47_272, 26_065, 61_168, 13_621], exSlot: 0, saku0: 130)
35         
36         
37         let tempStore = TemporaryDataStore.oneTimeEditor()
38         tempStore.guardEscaped().forEach(tempStore.delete)
39
40     }
41     
42     override func tearDown() {
43         
44         let store = TemporaryDataStore.oneTimeEditor()
45         store.guardEscaped().forEach(store.delete)
46         
47         super.tearDown()
48     }
49     
50     func setupShip(id shipId: Int, slotItems: [Int], exSlot: Int, saku0: Int) {
51         
52         guard let ship = store.ship(by: shipId) else {
53             
54             XCTFail("Can not get ship, \(shipId)")
55             
56             fatalError()
57         }
58         ship.onslot_0 = ship.master_ship.maxeq_0
59         ship.onslot_1 = ship.master_ship.maxeq_1
60         ship.onslot_2 = ship.master_ship.maxeq_2
61         ship.onslot_3 = ship.master_ship.maxeq_3
62         ship.onslot_4 = ship.master_ship.maxeq_4
63         
64         setSlot(slotItems: slotItems, to: ship)
65         
66         ship.slot_ex = exSlot
67         ship.extraItem = store.slotItem(by: ship.slot_ex)
68         
69         ship.sakuteki_0 = saku0
70         
71     }
72     
73     func setSlot(slotItems: [Int], to ship: Ship) {
74     
75         let newItems: [SlotItem] = slotItems
76             .filter { $0 != 0 && $0 != -1 }
77             .flatMap { store.slotItem(by: $0) }
78         ship.equippedItem = NSOrderedSet(array: newItems)
79         
80         slotItems.enumerated().forEach { offset, element in
81             ship.setItem(element, to: offset)
82         }
83     }
84     
85     // 小数点第2位以下切り捨て
86     func fitSakuteki(_ sakuteki: Double) -> Double {
87         
88         return Double(Int(sakuteki * 10)) / 10
89     }
90
91     func testOneShip() {
92         
93         // 千歳航改二
94         guard let ship = store.ship(by: 228) else {
95             
96             XCTFail("Can not get ship")
97             
98             fatalError()
99         }
100         
101         XCTAssertEqual(SimpleCalculator().calculate([ship]), 108)
102         
103         XCTAssertEqual(fitSakuteki(Formula33(1).calculate([ship])), -11.2)
104         XCTAssertEqual(fitSakuteki(Formula33(3).calculate([ship])), 127.9)
105         XCTAssertEqual(fitSakuteki(Formula33(4).calculate([ship])), 249.7)
106     }
107     
108     func testOne2Ship() {
109         
110         // 熊野改二
111         guard let ship = store.ship(by: 4_184) else {
112             
113             XCTFail("Can not get ship")
114             
115             fatalError()
116         }
117         
118         XCTAssertEqual(SimpleCalculator().calculate([ship]), 110)
119         
120         XCTAssertEqual(fitSakuteki(Formula33(1).calculate([ship])), -10.3)
121         XCTAssertEqual(fitSakuteki(Formula33(3).calculate([ship])), 133.6)
122         XCTAssertEqual(fitSakuteki(Formula33(4).calculate([ship])), 259.6)
123     }
124     
125     func testTwoShips() {
126         
127         // 千歳航改二
128         guard let ship1 = store.ship(by: 228) else {
129             
130             XCTFail("Can not get ship")
131             
132             fatalError()
133         }
134         // 熊野改二
135         guard let ship2 = store.ship(by: 4_184) else {
136             
137             XCTFail("Can not get ship")
138             
139             fatalError()
140         }
141         
142         XCTAssertEqual(SimpleCalculator().calculate([ship1, ship2]), 218)
143         
144         XCTAssertEqual(fitSakuteki(Formula33(1).calculate([ship1, ship2])), 14.4)
145         XCTAssertEqual(fitSakuteki(Formula33(3).calculate([ship1, ship2])), 297.6)
146         XCTAssertEqual(fitSakuteki(Formula33(4).calculate([ship1, ship2])), 545.4)
147     }
148     
149     func testTreeShips() {
150         
151         // 千歳航改二
152         guard let ship1 = store.ship(by: 228) else {
153             
154             XCTFail("Can not get ship")
155             
156             fatalError()
157         }
158         // 熊野改二
159         guard let ship2 = store.ship(by: 4_184) else {
160             
161             XCTFail("Can not get ship")
162             
163             fatalError()
164         }
165         // 筑摩改二
166         guard let ship3 = store.ship(by: 220) else {
167             
168             XCTFail("Can not get ship")
169             
170             fatalError()
171         }
172         
173         XCTAssertEqual(SimpleCalculator().calculate([ship1, ship2, ship3]), 348)
174         
175         XCTAssertEqual(fitSakuteki(Formula33(1).calculate([ship1, ship2, ship3])), 47.7)
176         XCTAssertEqual(fitSakuteki(Formula33(3).calculate([ship1, ship2, ship3])), 531.8)
177         XCTAssertEqual(fitSakuteki(Formula33(4).calculate([ship1, ship2, ship3])), 955.3)
178     }
179     
180     func testEscapedShips() {
181         
182         // 千歳航改二
183         guard let ship1 = store.ship(by: 228) else {
184             
185             XCTFail("Can not get ship")
186             
187             fatalError()
188         }
189         // 熊野改二
190         guard let ship2 = store.ship(by: 4_184) else {
191             
192             XCTFail("Can not get ship")
193             
194             fatalError()
195         }
196         // 筑摩改二
197         guard let ship3 = store.ship(by: 220) else {
198             
199             XCTFail("Can not get ship")
200             
201             fatalError()
202         }
203         
204         // 熊野改二を退避
205         do {
206             
207             let tempStore = TemporaryDataStore.oneTimeEditor()
208             let guardEscape = tempStore.createGuardEscaped()
209             guardEscape?.shipID = 4_184
210             guardEscape?.ensured = true
211         }
212         
213         XCTAssertEqual(SimpleCalculator().calculate([ship1, ship2, ship3]), 238)
214         
215         XCTAssertEqual(fitSakuteki(Formula33(1).calculate([ship1, ship2, ship3])), 22.0)
216         XCTAssertEqual(fitSakuteki(Formula33(3).calculate([ship1, ship2, ship3])), 362.1)
217         XCTAssertEqual(fitSakuteki(Formula33(4).calculate([ship1, ship2, ship3])), 659.6)
218     }
219 }