import Foundation import RastrilloApple import XCTest @testable import DocsKit final class DocumentAssetsTests: XCTestCase { @MainActor func testRelativeImageURLsAndCachedImagesUseCurrentDocument() async throws { let origin = try XCTUnwrap(URL(string: "https://example.com")) XCTAssertEqual(DocsImageStore.resolvedURL(source: "picture.png", documentPath: "/d/first", origin: origin)?.absoluteString, "https://example.com/d/picture.png") XCTAssertEqual(DocsImageStore.resolvedURL(source: "?picture=1", documentPath: "/d/second", origin: origin)?.absoluteString, "https://example.com/d/second?picture=1") let client = NativeHTTP(origin: origin) let store = DocsImageStore() let source = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+jRZkAAAAASUVORK5CYII=" await store.load(sources: [source], client: client, documentPath: "/d/first") XCTAssertNotNil(store.images(forDocumentPath: "/d/first", client: client)[source]) XCTAssertTrue(store.images(forDocumentPath: "/d/second", client: client).isEmpty) await store.load(sources: [], client: client, documentPath: "/d/second") XCTAssertTrue(store.images.isEmpty) } @MainActor func testAllTwelveBundledFontFacesResolve() { for (key, family) in [("font_sans", "Sans"), ("font_serif", "Serif"), ("font_mono", "Mono")] { for (bold, italic, face) in [(false, false, "Regular"), (true, false, "Bold"), (false, true, "Italic"), (true, true, "BoldItalic")] { var marks: [String: JSONValue] = [key: .object([:])] if bold { marks["strong"] = .object([:]) } if italic { marks["em"] = .object([:]) } let font = DocsFonts.font(marks: marks, size: 12, heading: false) XCTAssertEqual(font.fontName, "Liberation\(family)" + (face == "Regular" ? "" : "-\(face)")) } } XCTAssertEqual(DocsFonts.font(marks: [:], size: 12, heading: false).fontName, "LiberationSans") XCTAssertEqual(DocsFonts.font(marks: ["size_24": .object([:])], size: 12, heading: false).pointSize, 24) } @MainActor func testAttachmentsOccupyOneUTF16UnitAndInvalidImagesFail() { XCTAssertEqual(DocsAttachments.image(nil, alt: "long image description").length, 1) XCTAssertEqual(DocsAttachments.rule().length, 1) XCTAssertNil(DocsAttachments.decode(Data("not an image".utf8))) let png = Data(base64Encoded: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+jRZkAAAAASUVORK5CYII=")! XCTAssertNotNil(DocsAttachments.decode(png)) } }