Explorar o código

功能 - RTF 支持纯字符对比功能

zhudongyong hai 1 ano
pai
achega
6c565ce226

+ 8 - 4
KdanAutoTest/KdanAuto.xcodeproj/project.pbxproj

@@ -66,7 +66,7 @@
 		24848DDF29EF74AD002A7ED5 /* LogViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24848DDD29EF74AD002A7ED5 /* LogViewController.xib */; };
 		24848DE229EFCE63002A7ED5 /* CDoucumnetAIResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 24848DE129EFCE63002A7ED5 /* CDoucumnetAIResource.bundle */; };
 		24848DE429EFD0DF002A7ED5 /* Vision.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24848DE329EFD0DF002A7ED5 /* Vision.framework */; };
-		24848DE629F2A9E4002A7ED5 /* StringAutoCompare.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24848DE529F2A9E3002A7ED5 /* StringAutoCompare.swift */; };
+		24848DE629F2A9E4002A7ED5 /* StringAutoCompareTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24848DE529F2A9E3002A7ED5 /* StringAutoCompareTest.swift */; };
 		24A6FF49293091E000B34F2E /* AutoTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A6FF48293091E000B34F2E /* AutoTest.swift */; };
 		24A6FF4B2930939D00B34F2E /* TextColorAutoTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A6FF4A2930939D00B34F2E /* TextColorAutoTest.swift */; };
 		24A6FF4F2930A1E100B34F2E /* FontAutoTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A6FF4E2930A1E100B34F2E /* FontAutoTest.swift */; };
@@ -108,6 +108,7 @@
 		24DCE8B529506CDE004EBA35 /* AutoTestProperty.plist in Resources */ = {isa = PBXBuildFile; fileRef = 24DCE8B429506CDE004EBA35 /* AutoTestProperty.plist */; };
 		24DCE8BB29518FD3004EBA35 /* ProcessThumbnal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 240509B62943479800B501B2 /* ProcessThumbnal.swift */; };
 		24E3165D29DC35A20009E358 /* UpdateSDK.sh in Resources */ = {isa = PBXBuildFile; fileRef = 24E3165C29DC35A20009E358 /* UpdateSDK.sh */; };
+		24E8AE3B29F6A4A900988963 /* StringAutoBackTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24E8AE3A29F6A4A900988963 /* StringAutoBackTest.swift */; };
 		24FE3FF329BAF9B8004F4DD4 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24FE3FF229BAF9B8004F4DD4 /* CoreImage.framework */; };
 /* End PBXBuildFile section */
 
@@ -223,7 +224,7 @@
 		24848DDD29EF74AD002A7ED5 /* LogViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LogViewController.xib; sourceTree = "<group>"; };
 		24848DE129EFCE63002A7ED5 /* CDoucumnetAIResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = CDoucumnetAIResource.bundle; sourceTree = "<group>"; };
 		24848DE329EFD0DF002A7ED5 /* Vision.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Vision.framework; path = System/Library/Frameworks/Vision.framework; sourceTree = SDKROOT; };
-		24848DE529F2A9E3002A7ED5 /* StringAutoCompare.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringAutoCompare.swift; sourceTree = "<group>"; };
+		24848DE529F2A9E3002A7ED5 /* StringAutoCompareTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringAutoCompareTest.swift; sourceTree = "<group>"; };
 		24A6FF48293091E000B34F2E /* AutoTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoTest.swift; sourceTree = "<group>"; };
 		24A6FF4A2930939D00B34F2E /* TextColorAutoTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextColorAutoTest.swift; sourceTree = "<group>"; };
 		24A6FF4E2930A1E100B34F2E /* FontAutoTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontAutoTest.swift; sourceTree = "<group>"; };
@@ -274,6 +275,7 @@
 		24DCE8B22950543C004EBA35 /* AutoTestCellInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoTestCellInfo.swift; sourceTree = "<group>"; };
 		24DCE8B429506CDE004EBA35 /* AutoTestProperty.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = AutoTestProperty.plist; sourceTree = "<group>"; };
 		24E3165C29DC35A20009E358 /* UpdateSDK.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = UpdateSDK.sh; sourceTree = "<group>"; };
+		24E8AE3A29F6A4A900988963 /* StringAutoBackTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringAutoBackTest.swift; sourceTree = "<group>"; };
 		24FE3FF229BAF9B8004F4DD4 /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
 /* End PBXFileReference section */
 
@@ -530,7 +532,8 @@
 				24A6FF48293091E000B34F2E /* AutoTest.swift */,
 				246FE590299DCFC400706586 /* PDFCompareTest.swift */,
 				24D7000A292D16BB00DAB5EE /* StringAutoTest.swift */,
-				24848DE529F2A9E3002A7ED5 /* StringAutoCompare.swift */,
+				24E8AE3A29F6A4A900988963 /* StringAutoBackTest.swift */,
+				24848DE529F2A9E3002A7ED5 /* StringAutoCompareTest.swift */,
 				24A6FF4A2930939D00B34F2E /* TextColorAutoTest.swift */,
 				24A6FF4E2930A1E100B34F2E /* FontAutoTest.swift */,
 			);
@@ -960,7 +963,7 @@
 				24DCE8AD295046E7004EBA35 /* TestFileTypeCellView.swift in Sources */,
 				246FE591299DCFC400706586 /* PDFCompareTest.swift in Sources */,
 				24D7FFFE292B509000DAB5EE /* DataModel.swift in Sources */,
-				24848DE629F2A9E4002A7ED5 /* StringAutoCompare.swift in Sources */,
+				24848DE629F2A9E4002A7ED5 /* StringAutoCompareTest.swift in Sources */,
 				24CA2337298FD6BE00038E10 /* ImageCompareCellView.swift in Sources */,
 				24848DDA29EEBCBC002A7ED5 /* ASSizePropertyCell.swift in Sources */,
 				24D7FF9B29261A6400DAB5EE /* AppDelegate.swift in Sources */,
@@ -983,6 +986,7 @@
 				246FE5A3299E0FCD00706586 /* zip.c in Sources */,
 				24DCE8B1295047D8004EBA35 /* TestFileCellView.swift in Sources */,
 				24A6FF4B2930939D00B34F2E /* TextColorAutoTest.swift in Sources */,
+				24E8AE3B29F6A4A900988963 /* StringAutoBackTest.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

BIN=BIN
KdanAutoTest/KdanAuto.xcodeproj/project.xcworkspace/xcuserdata/zhudongyong.xcuserdatad/UserInterfaceState.xcuserstate


+ 13 - 1
KdanAutoTest/KdanAuto/Class/AdvanceSettingViewController/AdvanceSettingPropertyRules.plist

@@ -57,6 +57,12 @@
 				<key>Class</key>
 				<string>StringAutoTest</string>
 			</dict>
+			<dict>
+				<key>Name</key>
+				<string>跨平台字符对比测试</string>
+				<key>Class</key>
+				<string>StringAutoCompareTest</string>
+			</dict>
 		</array>
 		<key>Params</key>
 		<array>
@@ -2192,11 +2198,17 @@
 				<key>Class</key>
 				<string>StringAutoTest</string>
 			</dict>
+			<dict>
+				<key>Name</key>
+				<string>字符逆序对比测试</string>
+				<key>Class</key>
+				<string>StringAutoBackTest</string>
+			</dict>
 			<dict>
 				<key>Name</key>
 				<string>跨平台字符对比测试</string>
 				<key>Class</key>
-				<string>StringAutoCompare</string>
+				<string>StringAutoCompareTest</string>
 			</dict>
 		</array>
 		<key>Extention</key>

+ 0 - 516
KdanAutoTest/KdanAuto/Class/AutoTestCase/StringAutoCompare.swift

@@ -1,516 +0,0 @@
-//
-//  CharacterAutoTest.swift
-//  KdanAuto
-//
-//  Created by 朱东勇 on 2022/11/22.
-//
-
-import Foundation
-import Cocoa
-
-class StringAutoCompare : AutoTest {
-    
-//    override func type() -> String {
-//        return "PDFConvert_China_Auto_Test"
-//    }
-    
-    override func name() -> String {
-        return _name
-    }
-    
-    override func keys() -> NSArray {
-        return ["字符"]
-    }
-    
-    
-    override func needTest() -> Bool {
-        return self.selectedKeys().count > 0
-    }
-    
-    
-    override class func shared() -> AutoTest? {
-        return StringAutoCompare()
-    }
-    
-    
-    // Auto Test refrence Check File
-    override func autoTest(_ complention:@escaping (_ object:AutoTest, _ report:NSAttributedString?) -> ()) {
-        self.compareFinishedFiles.removeAllObjects();
-        self.convertFiles.removeAllObjects()
-        
-//        clearCacheFiles()
-        
-        let needCheckString = self.selectedKeys().contains("字符")
-        
-        if !needCheckString {
-            _status = .Finished
-            complention(self, self.reportString)
-            return
-        }
-        
-        _status = .Process
-        reportString = NSMutableAttributedString.init(string: "\n【\(String(self.fileType())) - \(self.name())】字符比对开始!\n",
-                                                      attributes:[.foregroundColor : NSColor.blue])
-        let files = DataModel.shared.originFilesFor(_fileType, type: _type)
-        self.testFiles = NSArray(array: files);
-        
-        let checkDirectory = self.checkFileDirectory()
-        let originDirectory = self.originFileDirectory()
-        let resultDirectory = self.resultFileDirectory()
-        
-        if (files.count > 0) {
-            try? FileManager.default.createDirectory(atPath: checkDirectory, withIntermediateDirectories: true);
-            try? FileManager.default.createDirectory(atPath: resultDirectory, withIntermediateDirectories: true);
-        }
-        
-        var tDegree = Double(0);
-        var tCount = Int(0)
-        var fileIndex = 0;
-        
-        var convertFileBlock = { (files:[String]) in }
-        convertFileBlock = { (files:[String]) in
-            if (fileIndex >= files.count) {
-                TestDegreeManager.shared().set(((tCount != 0) ? tDegree/Double(tCount) : 0.0),
-                                               fileType: self.fileType(),
-                                               type: self.type())
-                
-                self._status = .Finished
-                DispatchQueue.main.async {
-                    autoreleasepool {
-                        complention(self, self.reportString);
-                    }
-                }
-                return
-            }
-            
-            let fileName = files[fileIndex]
-            let fName = NSString(string: fileName).deletingPathExtension
-            let originPath = NSString(string: originDirectory).appendingPathComponent(fName+".pdf")
-            let resultPath = NSString(string: resultDirectory).appendingPathComponent(fName+"."+self.extention())
-            let checkPath = NSString(string: checkDirectory).appendingPathComponent(fName+"."+self.extention())
-            
-            
-            self.reportString?.append(NSMutableAttributedString.init(string: "\n【\(String(self.fileType())) - \(self.name())】开始转换文件 \"\(fName)\"\n",
-                                                                attributes:[.foregroundColor : NSColor.black]))
-            // ...
-            // 执行转换过程
-            let index = self.testFiles.index(of: fileName);
-            if (index != NSNotFound) {
-                self.convertProgress = Double(index) / Double(self.testFiles.count)
-            }
-            self.convertFiles.add(fileName);
-            self.testlog("开始对照:"+fileName, (self.compareProgress + self.convertProgress)/2.0)
-//            self.process(originPath, resultPath: resultPath) { status in
-                let status = 1
-                if FileManager.default.fileExists(atPath: resultPath) && status == 1 {
-                    if needCheckString && FileManager.default.fileExists(atPath: checkPath) {
-                        DispatchQueue.global().async {
-                            let checkString = self.readTextFile(checkPath as NSString)
-                            let resultStr = self.readTextFile(resultPath as NSString)
-                            
-                            if (checkString != nil && resultStr != nil) {
-                                let maxSize = checkString!.count
-                                let report = NSMutableAttributedString(string: "")
-                                let degree = self.compareString(checkString as! NSString, result: resultStr as! NSString) { appAttr in
-                                    report.append(appAttr)
-                                }
-//                                let degree = self.compareString(checkString as! NSString, result: resultStr as! NSString) { skipString, failString in
-//                                    self.appendErrorInfo(skipString, failString: failString)
-//                                }
-                                
-                                var color = NSColor.black
-                                if fabs(degree-100.0) >= 0.01 {
-                                    color = NSColor.red
-                                }
-                                tDegree += degree;
-                                tCount += 1
-                                
-                                TestDegreeManager.shared().set(degree,
-                                                               fileType: self.fileType(),
-                                                               type: self.type(),
-                                                               fileName: fileName)
-                                
-                                let successCount = Int(maxSize * Int(degree)/100)
-                                report.append(NSAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"比对完成,准确率\(degree)%(\(successCount)/\(maxSize))\n",
-                                                                                  attributes:[.foregroundColor : color]))
-                                if (report != nil) {
-                                    do {
-                                        let rtfData = try? report.data(from: .init(location: 0, length: report.length),
-                                                                                   documentAttributes: [.documentType: NSAttributedString.DocumentType.rtf])
-                                        
-                                        let path = NSString(string: resultPath).appendingPathExtension("rtf")
-                                        try? FileManager.default.removeItem(atPath: path!);
-                                        try? rtfData?.write(to: NSURL.fileURL(withPath: path!))
-                                    } catch {
-                                    }
-                                    self.reportString?.append(report)
-                                }
-                            }
-                            
-                            let index = self.testFiles.index(of: fileName);
-                            if (index != NSNotFound) {
-                                self.compareProgress = Double(index) / Double(self.testFiles.count)
-                            }
-                            self.compareFinishedFiles.add(fileName);
-                            self.testlog("对比完成:"+fileName, (self.compareProgress + self.convertProgress)/2.0)
-                            
-                            fileIndex += 1
-                            convertFileBlock(files);
-                        }
-                    }else {
-                        self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】对照文件 \"\(fName)\"不存在!\n",
-                                                                                 attributes:[.foregroundColor : NSColor.red]))
-                            
-                        let index = self.testFiles.index(of: fileName);
-                        if (index != NSNotFound) {
-                            self.compareProgress = Double(index) / Double(self.testFiles.count)
-                        }
-                        self.compareFinishedFiles.add(fileName);
-                        self.testlog("对比完成:"+fileName, (self.compareProgress + self.convertProgress)/2.0)
-                        
-                        fileIndex += 1
-                        convertFileBlock(files);
-                    }
-                }else {
-                    if (status == 0) {
-                        self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"转档失败!\n",
-                                                                            attributes:[.foregroundColor : NSColor.red]))
-                    }else if (status == -1 || status == -2) {
-                        self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"文档无法打开!\n",
-                                                                            attributes:[.foregroundColor : NSColor.red]))
-                    }else if (status == -3) {
-                        self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"转档中 Crash!\n",
-                                                                            attributes:[.foregroundColor : NSColor.red]))
-                    }
-                    
-                    let index = self.testFiles.index(of: fileName);
-                    if (index != NSNotFound) {
-                        self.compareProgress = Double(index) / Double(self.testFiles.count)
-                    }
-                    self.compareFinishedFiles.add(fileName);
-                    self.testlog("对比完成:"+fileName, (self.compareProgress + self.convertProgress)/2.0)
-                    fileIndex += 1
-                    convertFileBlock(files);
-                }
-//            }
-        }
-        convertFileBlock(files);
-    }
-    
-    ///Compare
-    
-    /// Tools
-    func appendErrorInfo(_ skipString:NSString, failString: NSString) {
-        if skipString.length > 0  && failString.length > 0 {
-            reportString?.append(NSMutableAttributedString.init(string: "对比字符串【\(skipString)】错识别为【\(failString)】\n",
-                                                                attributes:[.foregroundColor : NSColor.red]))
-        }else if (skipString.length > 0) {
-            reportString?.append(NSMutableAttributedString.init(string: "对比字符串【\(skipString)】未识别到\n",
-                                                                attributes:[.foregroundColor : NSColor.red]))
-        }else if failString.length > 0 {
-            reportString?.append(NSMutableAttributedString.init(string: "字符串【\(failString)】识别出错\n",
-                                                                attributes:[.foregroundColor : NSColor.red]))
-        }
-    }
-    
-    func attributeStringWith(_ skipString:NSString, failString: NSString) -> NSAttributedString {
-        if skipString.length > 0  && failString.length > 0 {
-            let strikethroughStyle = NSParagraphStyle.init()
-            let attString = NSMutableAttributedString.init(string: skipString as String,
-                                                           attributes:[.foregroundColor : NSColor.red,
-                                                                       .strikethroughStyle:NSNumber(integerLiteral: NSUnderlineStyle.single.rawValue),
-                                                                       ])
-            attString.append(NSMutableAttributedString.init(string: failString as String,
-                                                            attributes:[.foregroundColor : NSColor.blue,
-                                                            ]))
-            return attString
-        }else if (skipString.length > 0) {
-            let strikethroughStyle = NSParagraphStyle.init()
-            let attString = NSMutableAttributedString.init(string: skipString as String,
-                                                           attributes:[.foregroundColor : NSColor.red,
-                                                                       .strikethroughStyle:NSNumber(integerLiteral: NSUnderlineStyle.single.rawValue),
-                                                           ])
-            return attString
-        }else if failString.length > 0 {
-            let strikethroughStyle = NSParagraphStyle.init()
-            let attString = NSMutableAttributedString.init(string: failString as String,
-                                                           attributes:[.foregroundColor : NSColor.blue,
-                                                                      ])
-            return attString
-        }
-        
-        return NSAttributedString()
-    }
-    
-    func replaceUnicodeString(_ string:NSString) -> NSString {//中
-        let items = string.components(separatedBy: "\\u") as [NSString]
-        
-        var resultString = NSString()
-        for item in items {
-            if (item.contains("?")) {
-                let unicodeValue = item.intValue
-                let skipRange = item.range(of: "?")
-                let nextString = item.substring(from: Int(skipRange.location + skipRange.length)) as NSString
-                let bytes : [UInt8] = [UInt8(unicodeValue/256),UInt8(unicodeValue%256)]
-                let data = NSData.init(bytes: bytes, length: 2)
-                
-                let unicodeString = NSString.init(data: data as Data, encoding: NSUnicodeStringEncoding)! as NSString
-                resultString = resultString.appending(String("\(unicodeString)\(nextString)")) as NSString
-            }else {
-                resultString = resultString.appending(String(item)) as NSString
-            }
-        }
-        
-        return resultString
-    }
-    
-    
-    /// Compare
-    func compareString(_ check:NSString, result:NSString, callback:@escaping (_ appAttr:NSAttributedString)->()) -> Double {
-//    func compareString(_ check:NSString, result:NSString, failure:@escaping (_ skipString:NSString, _ failString:NSString)->()) -> Double {
-        return autoreleasepool {
-            var checkString = check
-            var resultStr = result
-            let maxSize = checkString.length
-            var successCount = 0;
-            /**
-             (A0 = B0)
-             - A-1 & B-1
-             (A0 != B0) & (A0 in B) & (B0 in A)
-             - 取 A0,B0最小 Range 值
-             - 字符串裁剪对齐
-             (A0 != B0) & (A0 in B)
-             - 存储B0到识别错误缓存
-             (A0 != B0) & (B0 in A)
-             - 存储 A0到识别遗漏字符串
-             (A0 != B0)
-             - 分别存储 A0、B0到遗漏及错误字串
-             */
-            var skipString = NSString()
-            var failString = NSString()
-            while (checkString.length > 0 && resultStr.length > 0) {
-                let subc = checkString.substring(to: 1) as NSString
-                let subr = resultStr.substring(to: 1) as NSString
-                
-                let cRange = checkString.range(of: subr as String)
-                let rRange = resultStr.range(of: subc as String)
-                
-                if subc.isEqual(to: subr) { // (A0 = B0)
-                                            // Check Success
-                    callback(attributeStringWith(skipString, failString: failString))
-//                    failure(skipString, failString)
-//                    self.appendErrorInfo(skipString, failString: failString)
-                    skipString = NSString()
-                    failString = NSString()
-                    
-                    
-                    checkString = checkString.substring(from:1) as NSString
-                    resultStr = resultStr.substring(from:1) as NSString
-                    successCount = successCount + 1
-                    callback(NSAttributedString(string: subc as String))
-                } else if (cRange.location != NSNotFound &&
-                           rRange.location != NSNotFound) {
-                    if (min(cRange.location, rRange.location) >= 2) {
-                        let nextc = checkString.substring(with: NSRange(location: 1, length: 1)) as NSString
-                        let nextr = resultStr.substring(with: NSRange(location: 1, length: 1)) as NSString
-                        let ncRange = checkString.range(of: nextr as String)
-                        let nrRange = resultStr.range(of: nextc as String)
-                        
-                        if (min(nrRange.location, ncRange.location) < min(cRange.location, rRange.location)) {
-                            if (ncRange.location < nrRange.location) {
-                                //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
-                                skipString = skipString.appending(subc as String) as NSString
-                                checkString = checkString.substring(from:1) as NSString
-                            }else {
-                                //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
-                                failString = failString.appending(subr as String) as NSString
-                                resultStr = resultStr.substring(from:1) as NSString
-                            }
-                        }else if (cRange.location < rRange.location) {
-                            //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
-                            skipString = skipString.appending(subc as String) as NSString
-                            checkString = checkString.substring(from:1) as NSString
-                        }else {
-                            //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
-                            failString = failString.appending(subr as String) as NSString
-                            resultStr = resultStr.substring(from:1) as NSString
-                        }
-                    }else {
-                        if (cRange.location < rRange.location) {
-                            //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
-                            skipString = skipString.appending(subc as String) as NSString
-                            checkString = checkString.substring(from:1) as NSString
-                        }else {
-                            //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
-                            failString = failString.appending(subr as String) as NSString
-                            resultStr = resultStr.substring(from:1) as NSString
-                        }
-//                        //                    self.appendErrorInfo(skipString, failString: failString)
-//                        callback(attributeStringWith(skipString, failString: failString))
-//                        //                    failure(skipString, failString)
-//                        skipString = NSString()
-//                        failString = NSString()
-//
-//                        // C:a[bcde]fghij
-//                        // R:f[klmnbvcx]a
-//                        if (cRange.location < rRange.location) {
-//                            let cacheString = checkString.substring(to:cRange.location + cRange.length)
-//                            callback(attributeStringWith(cacheString as NSString, failString: ""))
-//                            //                        failure(cacheString as NSString, "")
-//                            //                        self.reportString?.append(NSMutableAttributedString.init(string: "对照字符串【\(cacheString)】未识别到\n",
-//                            //                                                                                 attributes:[.foregroundColor : NSColor.red]))
-//                            checkString = checkString.substring(from:cRange.location) as NSString
-//                        }else {
-//                            let cacheString = resultStr.substring(to:rRange.location)
-//                            callback(attributeStringWith("", failString: cacheString as NSString))
-//                            //                        failure("", cacheString as NSString)
-//                            //                        self.reportString?.append(NSMutableAttributedString.init(string: "字符串【\(cacheString)】识别出错\n",
-//                            //                                                                                 attributes:[.foregroundColor : NSColor.red]))
-//                            resultStr = resultStr.substring(from:rRange.location + rRange.length) as NSString
-//                        }
-                    }
-                }else if (cRange.location != NSNotFound) {
-                    //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
-                    skipString = skipString.appending(subc as String) as NSString
-                    checkString = checkString.substring(from:1) as NSString
-                }else if (rRange.location != NSNotFound) {
-                    //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
-                    failString = failString.appending(subr as String) as NSString
-                    resultStr = resultStr.substring(from:1) as NSString
-                }else {
-                    //  两个子字串均未找到
-                    skipString = skipString.appending(subc as String) as NSString
-                    failString = failString.appending(subr as String) as NSString
-                    
-                    checkString = checkString.substring(from:1) as NSString
-                    resultStr = resultStr.substring(from:1) as NSString
-                }
-            }
-            
-            skipString = skipString.appending(checkString as String) as NSString
-            failString = failString.appending(resultStr as String) as NSString
-//            failure(skipString, failString)
-            callback(attributeStringWith(skipString, failString: failString))
-            callback(NSAttributedString(string: "\n"))
-            
-            let degree = (maxSize>1) ? Double(Float(successCount)/Float(maxSize) * 100) : 0
-            
-            return degree
-        }
-    }
-    
-    // Read File
-    func readTextFile(_ filePath:NSString) -> String? {
-        if NSArray(array: ["TXT", "txt"]).contains(filePath.pathExtension) {
-            var checkString = try? NSString.init(contentsOfFile: filePath as String, encoding: NSUTF8StringEncoding)
-            if (checkString != nil) {
-                checkString = checkString!.replacingOccurrences(of: "\n", with: "") as NSString
-                checkString = checkString!.replacingOccurrences(of: " ", with: "") as NSString
-                return checkString! as String
-            }
-            return nil
-        }else if NSArray(array: ["rtf", "RTF"]).contains(filePath.pathExtension) {
-            // Load check file
-            let checkData = NSData.init(contentsOfFile: filePath as String) as! Data
-            var documentAttributes:NSDictionary!
-            let checkAttString = NSAttributedString.init(rtf: checkData, documentAttributes: &documentAttributes)
-            var checkString = NSString(string: checkAttString!.string) as NSString
-            checkString = checkString.replacingOccurrences(of: "\n", with: "") as NSString
-            checkString = checkString.replacingOccurrences(of: " ", with: "") as NSString
-            // 常规 rtf 读取失败
-            
-            //使用框排进行读取
-            if (checkString.length > 0) {
-                return checkString as String?
-            }
-            
-            var resultString = try? NSString.init(contentsOfFile: filePath as String, encoding: NSUTF8StringEncoding)
-            
-            if (nil != resultString && !resultString!.contains("\\shptxt\\shptxt")) {
-                resultString = resultString!.replacingOccurrences(of: "\n", with: "") as NSString
-                resultString = resultString!.replacingOccurrences(of: " ", with: "") as NSString
-                return resultString! as String
-            }
-            
-            //识别字符串 \shptxt\shptxt ... }
-            let pageInfoStrings = resultString!.components(separatedBy: "\\shptxt\\shptxt") as NSArray
-            var finalString = ""
-            if pageInfoStrings.count > 0 {
-                let subStrings = pageInfoStrings.subarray(with: NSMakeRange(1, Int(pageInfoStrings.count - 1))) as! [String]
-                for pageInfoString in subStrings {
-                    let endRange = NSString(string: pageInfoString).range(of: "}")
-                    finalString = finalString.appending(NSString(string: pageInfoString).substring(to: endRange.location))
-                }
-            }
-            
-            
-            //识别所有 【空格 ~ \】 之间的值,并进行缝合
-            // Detect all strings between Spaces and \ and stitch
-            let strings = finalString.components(separatedBy: " ")
-            var resultStr = "" as NSString
-            for str in strings {
-                let markStr = str as NSString
-                
-                if (markStr.contains("\\f")) {
-                    let fRange = markStr.range(of: "\\f")
-                    let cRange = markStr.range(of: "\\c")
-                    let bRange = markStr.range(of: "\\b")
-                    let iRange = markStr.range(of: "\\i")
-                    let eRange = markStr.range(of: "\\e")
-                    let pRange = markStr.range(of: "\\p")
-                    let minPos = min(Int(fRange.location),
-                                     Int(cRange.location),
-                                     Int(bRange.location),
-                                     Int(iRange.location),
-                                     Int(eRange.location),
-                                     Int(pRange.location))
-                    resultStr = resultStr.appending(markStr.substring(to: minPos)) as NSString
-                }else {
-                    resultStr = resultStr.appending(markStr as String) as NSString
-                }
-            }
-            
-            resultStr = self.replaceUnicodeString(resultStr)
-            
-            
-            resultStr = resultStr.replacingOccurrences(of: "\n", with: "") as NSString
-            resultStr = resultStr.replacingOccurrences(of: " ", with: "") as NSString
-            resultStr = resultStr.replacingOccurrences(of: "\\pard", with: "") as NSString
-            resultStr = resultStr.replacingOccurrences(of: "\\par", with: "") as NSString
-            
-            return resultStr as String?
-        }
-        
-        return nil
-    }
-    
-    
-    override func compareFiles() -> NSArray? {
-        return nil
-    }
-    
-    override func compareFiles(_ fileName: String) -> NSArray? {
-        return nil
-    }
-    
-    
-    /**
-     Replace the refrence image for next image check test
-     */
-    override func canUpdateRefImage() -> Bool {
-        return false
-    }
-    
-    override func updateRefImage() {
-        
-    }
-    
-    override func canUpdateRefImage(_ fileName:String) -> Bool {
-        return false
-    }
-    
-    override func updateRefImage(_ fileName:String) {
-        
-    }
-    
-}

+ 192 - 0
KdanAutoTest/KdanAuto/Class/AutoTestCase/StringAutoCompareTest.swift

@@ -0,0 +1,192 @@
+//
+//  CharacterAutoTest.swift
+//  KdanAuto
+//
+//  Created by 朱东勇 on 2022/11/22.
+//
+
+import Foundation
+import Cocoa
+
+class StringAutoCompareTest : StringAutoTest {
+    
+    override class func shared() -> AutoTest? {
+        return StringAutoCompareTest()
+    }
+    
+    
+    // Auto Test refrence Check File
+    override func autoTest(_ complention:@escaping (_ object:AutoTest, _ report:NSAttributedString?) -> ()) {
+        self.compareFinishedFiles.removeAllObjects();
+        self.convertFiles.removeAllObjects()
+        
+//        clearCacheFiles()
+        
+        let needCheckString = self.selectedKeys().contains("字符")
+        
+        if !needCheckString {
+            _status = .Finished
+            complention(self, self.reportString)
+            return
+        }
+        
+        _status = .Process
+        reportString = NSMutableAttributedString.init(string: "\n【\(String(self.fileType())) - \(self.name())】字符比对开始!\n",
+                                                      attributes:[.foregroundColor : NSColor.blue])
+        let files = DataModel.shared.originFilesFor(_fileType, type: _type)
+        self.testFiles = NSArray(array: files);
+        
+        let checkDirectory = self.checkFileDirectory()
+        let originDirectory = self.originFileDirectory()
+        let resultDirectory = self.resultFileDirectory()
+        
+        if (files.count > 0) {
+            try? FileManager.default.createDirectory(atPath: checkDirectory, withIntermediateDirectories: true);
+            try? FileManager.default.createDirectory(atPath: resultDirectory, withIntermediateDirectories: true);
+        }
+        
+        var tDegree = Double(0);
+        var tCount = Int(0)
+        var fileIndex = 0;
+        
+        var convertFileBlock = { (files:[String]) in }
+        convertFileBlock = { (files:[String]) in
+            if (fileIndex >= files.count) {
+                TestDegreeManager.shared().set(((tCount != 0) ? tDegree/Double(tCount) : 0.0),
+                                               fileType: self.fileType(),
+                                               type: self.type())
+                
+                self._status = .Finished
+                DispatchQueue.main.async {
+                    autoreleasepool {
+                        complention(self, self.reportString);
+                    }
+                }
+                return
+            }
+            
+            let fileName = files[fileIndex]
+            let fName = NSString(string: fileName).deletingPathExtension
+            let originPath = NSString(string: originDirectory).appendingPathComponent(fName+".pdf")
+            let resultPath = NSString(string: resultDirectory).appendingPathComponent(fName+"."+self.extention())
+            let checkPath = NSString(string: checkDirectory).appendingPathComponent(fName+"."+self.extention())
+            
+            
+            self.reportString?.append(NSMutableAttributedString.init(string: "\n【\(String(self.fileType())) - \(self.name())】开始转换文件 \"\(fName)\"\n",
+                                                                attributes:[.foregroundColor : NSColor.black]))
+            // ...
+            // 执行转换过程
+            let index = self.testFiles.index(of: fileName);
+            if (index != NSNotFound) {
+                self.convertProgress = Double(index) / Double(self.testFiles.count)
+            }
+            self.convertFiles.add(fileName);
+            self.testlog("开始对照:"+fileName, (self.compareProgress + self.convertProgress)/2.0)
+//            self.process(originPath, resultPath: resultPath) { status in
+                let status = 1
+                if FileManager.default.fileExists(atPath: resultPath) && status == 1 {
+                    if needCheckString && FileManager.default.fileExists(atPath: checkPath) {
+                        DispatchQueue.global().async {
+                            let checkString = self.readTextFile(checkPath as NSString)
+                            let resultStr = self.readTextFile(resultPath as NSString)
+                            
+                            if (checkString != nil && resultStr != nil) {
+                                let maxSize = checkString!.count
+                                let report = NSMutableAttributedString(string: "")
+                                let degree = self.compareString(checkString as! NSString, result: resultStr as! NSString) { appAttr in
+                                    report.append(appAttr)
+                                }
+//                                let degree = self.compareString(checkString as! NSString, result: resultStr as! NSString) { skipString, failString in
+//                                    self.appendErrorInfo(skipString, failString: failString)
+//                                }
+                                
+                                var color = NSColor.black
+                                if fabs(degree-100.0) >= 0.01 {
+                                    color = NSColor.red
+                                }
+                                tDegree += degree;
+                                tCount += 1
+                                
+                                TestDegreeManager.shared().set(degree,
+                                                               fileType: self.fileType(),
+                                                               type: self.type(),
+                                                               fileName: fileName)
+                                
+                                let successCount = Int(maxSize * Int(degree)/100)
+                                report.append(NSAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"比对完成,准确率\(degree)%(\(successCount)/\(maxSize))\n",
+                                                                                  attributes:[.foregroundColor : color]))
+                                if (report != nil) {
+                                    do {
+                                        let rtfData = try? report.data(from: .init(location: 0, length: report.length),
+                                                                                   documentAttributes: [.documentType: NSAttributedString.DocumentType.rtf])
+                                        
+                                        let path = NSString(string: resultPath).appendingPathExtension("rtf")
+                                        try? FileManager.default.removeItem(atPath: path!);
+                                        try? rtfData?.write(to: NSURL.fileURL(withPath: path!))
+                                    } catch {
+                                    }
+                                    self.reportString?.append(report)
+                                }
+                            }
+                            
+                            let index = self.testFiles.index(of: fileName);
+                            if (index != NSNotFound) {
+                                self.compareProgress = Double(index) / Double(self.testFiles.count)
+                            }
+                            self.compareFinishedFiles.add(fileName);
+                            self.testlog("对比完成:"+fileName, (self.compareProgress + self.convertProgress)/2.0)
+                            
+                            fileIndex += 1
+                            convertFileBlock(files);
+                        }
+                    }else {
+                        self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】对照文件 \"\(fName)\"不存在!\n",
+                                                                                 attributes:[.foregroundColor : NSColor.red]))
+                            
+                        let index = self.testFiles.index(of: fileName);
+                        if (index != NSNotFound) {
+                            self.compareProgress = Double(index) / Double(self.testFiles.count)
+                        }
+                        self.compareFinishedFiles.add(fileName);
+                        self.testlog("对比完成:"+fileName, (self.compareProgress + self.convertProgress)/2.0)
+                        
+                        fileIndex += 1
+                        convertFileBlock(files);
+                    }
+                }else {
+                    if (status == 0) {
+                        self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"转档失败!\n",
+                                                                            attributes:[.foregroundColor : NSColor.red]))
+                    }else if (status == -1 || status == -2) {
+                        self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"文档无法打开!\n",
+                                                                            attributes:[.foregroundColor : NSColor.red]))
+                    }else if (status == -3) {
+                        self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"转档中 Crash!\n",
+                                                                            attributes:[.foregroundColor : NSColor.red]))
+                    }
+                    
+                    let index = self.testFiles.index(of: fileName);
+                    if (index != NSNotFound) {
+                        self.compareProgress = Double(index) / Double(self.testFiles.count)
+                    }
+                    self.compareFinishedFiles.add(fileName);
+                    self.testlog("对比完成:"+fileName, (self.compareProgress + self.convertProgress)/2.0)
+                    fileIndex += 1
+                    convertFileBlock(files);
+                }
+//            }
+        }
+        convertFileBlock(files);
+    }
+    
+}
+
+
+// Dispared
+class StringAutoCompare : StringAutoCompareTest {
+    
+    override class func shared() -> AutoTest? {
+        return StringAutoCompareTest()
+    }
+    
+}

+ 12 - 3
KdanAutoTest/KdanAuto/Class/AutoTestCase/StringAutoTest.swift

@@ -335,11 +335,20 @@ class StringAutoTest : AutoTest {
                             resultStr = resultStr.substring(from:1) as NSString
                         }
                     }else {
+//                        var scale = (skipString.length > 0) ? (Float(checkString.length) / Float(skipString.length)) : Float(1.0)
+//                        if (checkString.length > skipString.length && cRange.location <= Int(Float(rRange.location)*scale)) {
+//                            //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
+//                            skipString = skipString.appending(subc as String) as NSString
+//                            checkString = checkString.substring(from:1) as NSString
+//                        }else if (checkString.length <= skipString.length && cRange.location > Int(Float(rRange.location)*scale)) {
+//                            failString = failString.appending(subr as String) as NSString
+//                            resultStr = resultStr.substring(from:1) as NSString
+//                        }else
                         if (cRange.location < rRange.location) {
                             //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
                             skipString = skipString.appending(subc as String) as NSString
                             checkString = checkString.substring(from:1) as NSString
-                        }else {
+                        }else  {
                             //‘subc' 字符串有在‘resultStr’中,但'subr'不在’checkString‘中,resultStr 往后推一
                             failString = failString.appending(subr as String) as NSString
                             resultStr = resultStr.substring(from:1) as NSString
@@ -403,8 +412,8 @@ class StringAutoTest : AutoTest {
         if NSArray(array: ["TXT", "txt"]).contains(filePath.pathExtension) {
             var checkString = try? NSString.init(contentsOfFile: filePath as String, encoding: NSUTF8StringEncoding)
             if (checkString != nil) {
-                checkString = checkString!.replacingOccurrences(of: "\n", with: "") as NSString
-                checkString = checkString!.replacingOccurrences(of: " ", with: "") as NSString
+//                checkString = checkString!.replacingOccurrences(of: "\n", with: "") as NSString
+//                checkString = checkString!.replacingOccurrences(of: " ", with: "") as NSString
                 return checkString! as String
             }
             return nil