Skip to content

Commit

Permalink
テスト作成
Browse files Browse the repository at this point in the history
  • Loading branch information
akidon0000 committed Feb 15, 2024
1 parent c00cf89 commit ac51006
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 73 deletions.
130 changes: 66 additions & 64 deletions Sources/Logging/Logging.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ protocol AKLoggerProtocol {
func notice<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func warn<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func error<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func criti<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func critical<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
}

public struct AKLogger: AKLoggerProtocol {
Expand All @@ -16,95 +16,97 @@ public struct AKLogger: AKLoggerProtocol {
print(message)
}

internal var dateFormatter: (Date) -> String = { date in
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
return formatter.string(from: date)
}

private enum LogLevel: Int {
case trace = 100
case debug = 200
case info = 300
case notice = 400
case warn = 500
case error = 600
case criti = 700
case trace = 100
case debug = 200
case info = 300
case notice = 400
case warn = 500
case error = 600
case critical = 700

func stringValue() -> String {
switch self {
case .trace: return "TRACE"
case .debug: return "DEBUG"
case .info: return "INFO"
case .notice: return "NOTICE"
case .warn: return "WARN"
case .error: return "ERROR"
case .criti: return "CRITI"
case .trace: return "TRACE"
case .debug: return "DEBUG"
case .info: return "INFO"
case .notice: return "NOTICE"
case .warn: return "WARN"
case .error: return "ERROR"
case .critical: return "CRITICAL"
}
}
}

private func log<T>(_ message: @autoclosure () -> T,
level: LogLevel, filename: String, line: Int, function: String) {
let date = dateFormatter(Date())
let levelStr = level.stringValue()
let cleanedfile = cleanedFilename(filename)

let msg = message()
var logMessage = ""

logMessage = "\(dateFormatter.string(from: Date())) [\(level.stringValue())] \(cleanedfile):\(line) - \(msg)"
let logMessage = "\(date) [\(levelStr)] \(cleanedfile):\(line) - \(function):\(msg)"
logHandler(logMessage)
}

private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
return formatter
}()

private var cleanedFilenamesCache: NSCache<AnyObject, AnyObject> = NSCache()
private func cleanedFilename(_ filename: String) -> String {
if let cleanedfile:String = cleanedFilenamesCache.object(forKey: filename as AnyObject) as? String {
return cleanedfile
} else {
var retval = ""
let items = filename.split{$0 == "/"}.map(String.init)

if items.count > 0 {
retval = items.last!
if let cleanedfile: String = cleanedFilenamesCache.object(forKey: filename as AnyObject) as? String {
return cleanedfile
} else {
var retval = ""
let items = filename.split { $0 == "/" }.map(String.init)

if items.count > 0 {
retval = items.last!
}
cleanedFilenamesCache.setObject(retval as AnyObject, forKey: filename as AnyObject)
return retval
}
}
cleanedFilenamesCache.setObject(retval as AnyObject, forKey: filename as AnyObject)
return retval
}
}
}

extension AKLogger {
public func trace<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .trace, filename: filename, line: line, function: function)
}
extension AKLogger {
public func trace<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .trace, filename: filename, line: line, function: function)
}

public func debug<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .debug, filename: filename, line: line, function: function)
}
public func debug<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .debug, filename: filename, line: line, function: function)
}

public func info<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .info, filename: filename, line: line, function: function)
}
public func info<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .info, filename: filename, line: line, function: function)
}

public func notice<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .notice, filename: filename, line: line, function: function)
}
public func notice<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .notice, filename: filename, line: line, function: function)
}

public func warn<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .warn, filename: filename, line: line, function: function)
}
public func warn<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .warn, filename: filename, line: line, function: function)
}

public func error<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .error, filename: filename, line: line, function: function)
}
public func error<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .error, filename: filename, line: line, function: function)
}

public func criti<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .criti, filename: filename, line: line, function: function)
public func critical<T>(_ message: @autoclosure () -> T,
filename: String = #file,
line: Int = #line,
function: String = #function) {
log(message(), level: .critical, filename: filename, line: line, function: function)
}
}
33 changes: 24 additions & 9 deletions Tests/LoggingTests/LoggingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,50 @@ import XCTest
@testable import AKLogger

final class AKLoggerTests: XCTestCase {

func testLogOutput() {
var loggedMessages: [String] = []
var logger = AKLogger()
logger.logHandler = { message in
loggedMessages.append(message)
}
logger.dateFormatter = { date in
return "00:00:00"
}

logger.trace("traceメッセージ")
XCTAssertTrue(loggedMessages[0].contains("traceメッセージ"))
let traceMessage = "00:00:00 [TRACE] LoggingTests.swift:\(#line-1) - \(#function):traceメッセージ"
XCTAssertEqual(loggedMessages[0], traceMessage)


logger.debug("debugメッセージ")
XCTAssertTrue(loggedMessages[1].contains("debugメッセージ"))
let debugMessage = "00:00:00 [DEBUG] LoggingTests.swift:\(#line-1) - \(#function):debugメッセージ"
XCTAssertEqual(loggedMessages[1], debugMessage)


logger.info("infoメッセージ")
XCTAssertTrue(loggedMessages[2].contains("infoメッセージ"))
let infoMessage = "00:00:00 [INFO] LoggingTests.swift:\(#line-1) - \(#function):infoメッセージ"
XCTAssertEqual(loggedMessages[2], infoMessage)


logger.notice("noticeメッセージ")
XCTAssertTrue(loggedMessages[3].contains("noticeメッセージ"))
let noticeMessage = "00:00:00 [NOTICE] LoggingTests.swift:\(#line-1) - \(#function):noticeメッセージ"
XCTAssertEqual(loggedMessages[3], noticeMessage)


logger.warn("warnメッセージ")
XCTAssertTrue(loggedMessages[4].contains("warnメッセージ"))
let warnMessage = "00:00:00 [WARN] LoggingTests.swift:\(#line-1) - \(#function):warnメッセージ"
XCTAssertEqual(loggedMessages[4], warnMessage)


logger.error("errorメッセージ")
XCTAssertTrue(loggedMessages[5].contains("errorメッセージ"))
let errorMessage = "00:00:00 [ERROR] LoggingTests.swift:\(#line-1) - \(#function):errorメッセージ"
XCTAssertEqual(loggedMessages[5], errorMessage)

logger.criti("critiメッセージ")
XCTAssertTrue(loggedMessages[6].contains("critiメッセージ"))

print(loggedMessages)
logger.critical("criticalメッセージ")
let criticalMessage = "00:00:00 [CRITICAL] LoggingTests.swift:\(#line-1) - \(#function):criticalメッセージ"
XCTAssertEqual(loggedMessages[6], criticalMessage)

}
}

0 comments on commit ac51006

Please sign in to comment.