130 lines
4.5 KiB
Swift
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
|
|
}
|
|
}
|