From 52b34296f38f28395d723e623cb7f814cf4ead5f Mon Sep 17 00:00:00 2001 From: Alisa Mylnikova Date: Mon, 2 Jul 2018 15:52:39 +0700 Subject: [PATCH] Add first rendering tests --- Macaw.xcodeproj/project.pbxproj | 8 ++ MacawTests/MacawSVGTests.swift | 80 +++++++++++++++++- .../w3cSVGTests/color-prop-01-b-manual.jpg | Bin 0 -> 21373 bytes .../w3cSVGTests/paths-data-04-t-manual.jpg | Bin 0 -> 24317 bytes 4 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 MacawTests/w3cSVGTests/color-prop-01-b-manual.jpg create mode 100644 MacawTests/w3cSVGTests/paths-data-04-t-manual.jpg diff --git a/Macaw.xcodeproj/project.pbxproj b/Macaw.xcodeproj/project.pbxproj index d42b621e..1e7f0370 100644 --- a/Macaw.xcodeproj/project.pbxproj +++ b/Macaw.xcodeproj/project.pbxproj @@ -454,6 +454,8 @@ 5B7E79CF20CBE69700C50BCF /* masking-path-02-b-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = 5B7E79CD20CBE69700C50BCF /* masking-path-02-b-manual.svg */; }; 5B7E79DE20D2781A00C50BCF /* masking-intro-01-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = 5B7E79DC20D2781A00C50BCF /* masking-intro-01-f-manual.reference */; }; 5B7E79DF20D2781A00C50BCF /* masking-intro-01-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = 5B7E79DD20D2781A00C50BCF /* masking-intro-01-f-manual.svg */; }; + 5B8C8E7D20EA0568002AEA29 /* paths-data-04-t-manual.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5B8C8E7C20EA0568002AEA29 /* paths-data-04-t-manual.jpg */; }; + 5B8C8E8120EA192F002AEA29 /* color-prop-01-b-manual.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5B8C8E7F20EA192F002AEA29 /* color-prop-01-b-manual.jpg */; }; 5BAE201F208E1211006BF277 /* SVGCanvas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BAE201E208E1211006BF277 /* SVGCanvas.swift */; }; 5BAE2038208E163D006BF277 /* polyline.reference in Resources */ = {isa = PBXBuildFile; fileRef = 5BAE2022208E1637006BF277 /* polyline.reference */; }; 5BAE2039208E163D006BF277 /* polygon.reference in Resources */ = {isa = PBXBuildFile; fileRef = 5BAE2023208E1637006BF277 /* polygon.reference */; }; @@ -854,6 +856,8 @@ 5B7E79CD20CBE69700C50BCF /* masking-path-02-b-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "masking-path-02-b-manual.svg"; sourceTree = ""; }; 5B7E79DC20D2781A00C50BCF /* masking-intro-01-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "masking-intro-01-f-manual.reference"; sourceTree = ""; }; 5B7E79DD20D2781A00C50BCF /* masking-intro-01-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "masking-intro-01-f-manual.svg"; sourceTree = ""; }; + 5B8C8E7C20EA0568002AEA29 /* paths-data-04-t-manual.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "paths-data-04-t-manual.jpg"; sourceTree = ""; }; + 5B8C8E7F20EA192F002AEA29 /* color-prop-01-b-manual.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "color-prop-01-b-manual.jpg"; sourceTree = ""; }; 5BAE201E208E1211006BF277 /* SVGCanvas.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SVGCanvas.swift; sourceTree = ""; }; 5BAE2022208E1637006BF277 /* polyline.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = polyline.reference; sourceTree = ""; }; 5BAE2023208E1637006BF277 /* polygon.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = polygon.reference; sourceTree = ""; }; @@ -1313,6 +1317,8 @@ 5B1AE18320B6A669007EECCB /* w3cSVGTests */ = { isa = PBXGroup; children = ( + 5B8C8E7F20EA192F002AEA29 /* color-prop-01-b-manual.jpg */, + 5B8C8E7C20EA0568002AEA29 /* paths-data-04-t-manual.jpg */, 5B1AE22D20B6A669007EECCB /* color-prop-01-b-manual.reference */, 5B1AE18A20B6A669007EECCB /* color-prop-01-b-manual.svg */, 5B1AE22C20B6A669007EECCB /* color-prop-02-f-manual.reference */, @@ -1746,6 +1752,7 @@ 5B1AE2B620B6A669007EECCB /* paths-data-04-t-manual.svg in Resources */, 5B1AE25620B6A669007EECCB /* paths-data-05-t-manual.reference in Resources */, 5B1AE2D020B6A669007EECCB /* struct-defs-01-t-manual.reference in Resources */, + 5B8C8E8120EA192F002AEA29 /* color-prop-01-b-manual.jpg in Resources */, 5B1AE25020B6A669007EECCB /* render-elems-01-t-manual.reference in Resources */, 5B1AE24520B6A669007EECCB /* struct-frag-01-t-manual.reference in Resources */, 5B1AE25B20B6A669007EECCB /* painting-stroke-01-t-manual.svg in Resources */, @@ -1766,6 +1773,7 @@ 5B37139B20BE95D7004BB6EE /* pservers-grad-07-b-manual.svg in Resources */, 5B1AE2B920B6A669007EECCB /* painting-control-02-f-manual.svg in Resources */, 5B7E79DE20D2781A00C50BCF /* masking-intro-01-f-manual.reference in Resources */, + 5B8C8E7D20EA0568002AEA29 /* paths-data-04-t-manual.jpg in Resources */, 5B1AE28A20B6A669007EECCB /* shapes-polygon-01-t-manual.reference in Resources */, 5B1AE27920B6A669007EECCB /* shapes-circle-01-t-manual.svg in Resources */, 5B1AE25E20B6A669007EECCB /* paths-data-17-f-manual.reference in Resources */, diff --git a/MacawTests/MacawSVGTests.swift b/MacawTests/MacawSVGTests.swift index 10f1ffdd..ae908a75 100644 --- a/MacawTests/MacawSVGTests.swift +++ b/MacawTests/MacawSVGTests.swift @@ -210,7 +210,7 @@ class MacawSVGTests: XCTestCase { } func testColorProp01() { - validateJSON("color-prop-01-b-manual") + validateJSONAndImage("color-prop-01-b-manual") } func testShapesEllipse01() { @@ -534,7 +534,7 @@ class MacawSVGTests: XCTestCase { } func testPathsData04() { - validateJSON("paths-data-04-t-manual") + validateJSONAndImage("paths-data-04-t-manual") } func testPaintingStroke04() { @@ -572,4 +572,80 @@ class MacawSVGTests: XCTestCase { func testMaskingIntro01() { validateJSON("masking-intro-01-f-manual") } + + func saveImage(image: UIImage, fileName: String) -> URL? { + guard let data = UIImageJPEGRepresentation(image, 0.6) else { + return .none + } + guard let directory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) as NSURL else { + return .none + } + do { + let path = directory.appendingPathComponent("\(fileName).jpg")! + try data.write(to: path) + return path + } catch { + print(error.localizedDescription) + return .none + } + } + + func imageForTest(_ test: String) -> UIImage { + let bundle = Bundle(for: type(of: TestUtils())) + do { + let node = try SVGParser.parse(bundle: bundle, path: test) + var frame = node.bounds + if frame == nil, let group = node as? Group { + frame = Group(contents: group.contents).bounds + } + let view = MacawView(node: node, frame: frame!.toCG()) + let renderer = RenderUtils.createNodeRenderer(node, view: view, animationCache: view.animationCache) + let image = renderer.renderToImage(bounds: frame!) + return UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: UIImageOrientation.downMirrored) + } catch { + XCTFail(error.localizedDescription) + } + XCTFail() + return UIImage() + } + + func testA() { + createImage("paths-data-04-t-manual") + } + + func createImage(_ test: String) { + if saveImage(image: imageForTest(test), fileName: test) == nil { + XCTFail() + } + } + + func validateImage(_ test: String) { + let image = imageForTest(test) + let tempPath = saveImage(image: image, fileName: "temp") + let nodeImage = UIImage(contentsOfFile: tempPath!.path)! + validateImage(nodeImage: nodeImage, referenceFile: test) + } + + func validateImage(nodeImage: UIImage, referenceFile: String) { + let bundle = Bundle(for: type(of: TestUtils())) + guard let path = bundle.path(forResource: referenceFile, ofType: "jpg") else { + XCTFail("No reference file \(referenceFile)") + return + } + + let referenceImage = UIImage(contentsOfFile: path) + let referenceContent = UIImagePNGRepresentation(referenceImage!)! + let nodeContent = UIImagePNGRepresentation(nodeImage)! + + if referenceContent != nodeContent { + let referencePath = saveImage(image: referenceImage!, fileName: referenceFile + "_reference") + let _ = saveImage(image: nodeImage, fileName: referenceFile + "_incorrect") + XCTFail("Not equal, see both pictures in \(String(describing: referencePath!.deletingLastPathComponent().path))") + } + } + + func validateJSONAndImage(_ test: String) { + validateJSON(test) + validateImage(test) + } } diff --git a/MacawTests/w3cSVGTests/color-prop-01-b-manual.jpg b/MacawTests/w3cSVGTests/color-prop-01-b-manual.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0cdf0fbdc88bc38d4f74194fd5a6c40dfb18d0ae GIT binary patch literal 21373 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
d~k{KeP(bzoI@ol1AZ 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 Pe_?dq33~>HXHEPc{rzeV literal 0 HcmV?d00001 diff --git a/MacawTests/w3cSVGTests/paths-data-04-t-manual.jpg b/MacawTests/w3cSVGTests/paths-data-04-t-manual.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a351a9c8ce8a804fcd5668761053290d0f04cf32 GIT binary patch literal 24317 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

AAI4x!Wr>bx#IvGCE)w%4MlgAABz|Bg$^>$}Fj) zy-N!2y;^3rd#3wY!`3pl=<8V@Y*$AiZI(saa*1A=q4UvZ5!TnEPc$(6CwcA<-3}PP z>D8-S$8KfczB%dMy}MGLsS}%&lz289%P=h9ndHZ?@^#yf`M}+cmyhoM#oaeK)+O1uB>;A2m;o%dU zt7~L#NAKy{bVf;fiQz))`3aV}3m%lN@44<6-*rp=@cGt#iP5&!hXP-V_i!FMue)OF zrY9vSWtE0^_`U95vhgi^bYK3D$-tt#*+ z2eHW4zkp{99TM5IpucUllx1>`vDwE;ZOAg88 zzGr*%zx8ZydhhkYb?uc*6XA-(-hCcV0#3cUmyw!kBjC;=w}tUlSiI0anOEfnFMs8C zZK>Y9x?S)nkNLIt%DW3hLu00?Z(ugfC!&+M1b@RT>9EViFS}=-K5KSLI`XTe&Fhs) zu3@tr40k!PMLgcQfQ^X$SA-Zrhd$j;S^H3fv4)7=+m&m392fk^yO{sSb!F7cuyc=8 zXMIX(GI}B;V$$lE#Hf&N!G39e;-ZXSv1gw?o1MzL=2y?W(kl~{R{JVQ+*M@ODZF#N z_20#5A7Wp|acteytJah+ky&_Brb{w5`Yg|yh&vj~qO_Hmngw~y@ zDau+0zDk%(o5%P;xAjW+HaVF~Z`Ua#d^{~WN8`oe#oAg-9B*86A~I&#O)svjTz1nr z+itP?+)@>fRhK>3%sm`V%aofi`jgQ~eO_l&qu>9?tUbRlLD9F~Wy0OeNq*fbu0M2n zRy{N(_rF$hlXuXRq)sukZ=8e>aE7(bW4x%*(fP(|_K?YoZmyt#KeV!zn7 zY@Qi+rp+qd6@9=$UAm)8d0%nNmwNs^;YR0)&MbdCJ`#AsMaA}G`}wou6t{e+%GlOlc1=$6a(*6D^7pb2KW9I&v=vu2eQN^l z%d>aaWPkX!^^vqc`?Btg@41PO=9+zbpk`m5&p&gY^W=*~#&MT{?VWI9lz|u96xkVm zR9pVA*G~GZw&R|UER#+tXXtEWcfIBJ`I%AgPKnoZCdTVkG>80XsHtE6$Mr+_;kW62 zSNd+}MoIR_x&B?A`&&iDTaNAc!8iQO>~Ez|7W87QJw%@RhOyCWCTvsS86K|q#{%3d2%J)y6u$pYQvZ)E`$qdO#`RC8 zz6bUd*Pr0hVE+1_;h$9h1OLA~_kXHZ|7SR+F>2aqxQ(We(Y%1Y4B1ov`1Pno%YK1UhI`1^Rp^mi@BD3a`)lO{@er{^80@i04A-00RR91 literal 0 HcmV?d00001