Files
KissMe/KissMeConsole/Sources/Tests/DB1_CandleData_Tests.swift
2024-11-08 23:24:03 +09:00

130 lines
4.5 KiB
Swift

//
// DB1_CandleData_Tests.swift
// KissMeConsole
//
// Created by ened-book-m1 on 11/8/24.
//
import Foundation
import KissMe
import KissMeme
struct DB1_CandleData_Tests: KissTestCase {
let test_1_FieldType = {
let v1: Int64 = 0
let v2: Int64 = 1
let v3: Int64 = 65536
let v4: Int64 = -2
assertEqual(v1.fieldType, .uint8)
assertEqual(v2.fieldType, .uint8)
assertEqual(v3.fieldType, .uint32)
assertEqual(v4.fieldType, .uint64)
}
let test_2_DateTimeSince2020 = {
let kissDate = Date.date(yyyyMMdd: "20200101", HHmmss: "000000")
let timestamp = UInt64(kissDate!.timeIntervalSince1970)
assertEqual(kissDate!.timeIntervalSince2020, 0)
let today = Date()
let todayTimestampSince2020 = UInt64(today.timeIntervalSince2020)
let diffTimeStamp = UInt64(today.timeIntervalSince1970) - timestamp
assertEqual(todayTimestampSince2020, diffTimeStamp)
}
let test_3_ParseCandleCsvFileName = {
let candleMinName = CandleMinuteFileName()
let url = "/Users/ened/Kiss/KissMe/bin/data/000020/min/candle-20230705.csv"
guard let (productNo, yyyyMMdd) = candleMinName.matchedUrl(url) else {
return
}
assertEqual(productNo, "000020")
assertEqual(yyyyMMdd, "20230705")
}
let test_4_BuildSamsungDB = {
let productNo = Self.samsungProductNo
let year = Self.year
let month = Self.month
let csvFiles = Self.collectCsv(productNo: productNo, yyyy: year, MM: month)
let dataPath = URL.currentDirectory().appending(path: "data")
for csvFile in csvFiles {
let candleMinName = CandleMinuteFileName()
if let (_, yyyyMMdd) = candleMinName.matchedUrl(csvFile.path), let year = Int(yyyyMMdd.prefix(4)) {
let yearDbPath = dataPath.appending(path: "\(productNo)/min/candle-\(year).db1")
}
let yearDbPath = dataPath.appending(path: "\(productNo)/min/candle-\(year).db1")
try? FileManager.default.removeItem(at: yearDbPath)
try? FileManager.default.createDirectory(at: yearDbPath, withIntermediateDirectories: true)
do {
let candles = try [Domestic.Candle].readCsv(fromFile: csvFile)
let db = try KissDB(directory: yearDbPath)
try db.begin()
for candle in candles {
let candleData = try CandleData(candle: candle)
let item = KissDB.DataItem(key: candleData.key, value: candleData.data)
try db.insertData(item: item)
assertEqual(candleData.candle, candle)
}
try db.commit()
} catch {
print("\(error)")
}
}
}
let test_5_CountSamsungDB: () -> Void = {
let productNo = Self.samsungProductNo
let year = Self.year
let yyyyMM = String(year) + Self.month
let dataPath = URL.currentDirectory().appending(path: "data")
let yearDbPath = dataPath.appending(path: "\(productNo)/min/candle-\(year).db1")
do {
let db = try KissDB(directory: yearDbPath)
try db.begin()
try db.selectData(into: { (dataItem: KissDB.DataItem) -> Bool in
let candleData = CandleData(key: dataItem.key, data: dataItem.value)
assertEqual(String(candleData.candleDate.prefix(6)), yyyyMM)
return true
})
try db.rollback()
} catch {
print("\(error)")
}
}
static let samsungProductNo = "005930"
static let year = "2023"
static let month = "06"
static func collectCsv(productNo: String, yyyy: String, MM: String) -> [URL] {
guard let enumerator = FileManager.subPathFiles("data/\(productNo)") else {
return []
}
let candleMinName = CandleMinuteFileName()
var csvFiles = [URL]()
for case let fileUrl as URL in enumerator {
guard let (fileProductNo, yyyyMMdd) = candleMinName.matchedUrl(fileUrl.path) else {
continue
}
if fileProductNo == productNo, yyyyMMdd.prefix(4) == yyyy, yyyyMMdd.dropFirst(4).prefix(2) == MM {
csvFiles.append(fileUrl)
}
}
return csvFiles
}
}