1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
import XCTest
@testable import WIT
class PackageResolverTests: XCTestCase {
class InMemoryLoader: PackageFileLoader {
enum Node: ExpressibleByDictionaryLiteral, ExpressibleByStringLiteral {
case directory(children: [String: Node])
case file(String)
init(dictionaryLiteral elements: (String, Node)...) {
self = .directory(children: Dictionary(uniqueKeysWithValues: elements))
}
init(stringLiteral value: String) {
self = .file(value)
}
}
struct FilePath: CustomStringConvertible {
let fileName: String
let node: Node
var description: String { fileName }
}
func convert(_ children: [String: Node]) -> [FilePath] {
return children.map { key, value in
return FilePath(fileName: key, node: value)
}
}
func packageFiles(in packageDirectory: FilePath) throws -> [FilePath] {
switch packageDirectory.node {
case .directory(let children):
return convert(children.filter { $0.key.hasSuffix(".wit") })
case .file: fatalError()
}
}
func contentsOfWITFile(at filePath: FilePath) throws -> String {
switch filePath.node {
case .directory: fatalError()
case .file(let string): return string
}
}
func dependencyDirectories(from packageDirectory: FilePath) throws -> [FilePath] {
switch packageDirectory.node {
case .directory(let children):
switch children["deps"] {
case .directory(let children): return convert(children)
default: fatalError()
}
case .file: fatalError()
}
}
}
func testLoadDependencies() throws {
let loader = InMemoryLoader()
let (mainPackage, packageResolver) = try PackageResolver.parse(
directory: .init(
fileName: "pkg",
node: [
"apple.wit": """
package fruit:apple
interface apple {
use fruit:banana/types.{size}
use fruit:peach/types.{color}
type check1 = size
type check2 = color
}
""",
"deps": [
"banana": [
"banana.wit": """
package fruit:banana
interface types {
type size = u32
}
"""
],
"peach-x": [
"peach.wit": """
package fruit:peach
interface types {
type color = string
}
"""
],
],
]
),
loader: loader
)
let context = SemanticsContext(rootPackage: mainPackage, packageResolver: packageResolver)
let (appleIface, sourceFile) = try context.lookupInterface(name: "apple", contextPackage: mainPackage)
let declContext = DeclContext(
kind: .interface(appleIface, sourceFile: sourceFile, context: .package(mainPackage.packageName)),
packageUnit: mainPackage,
packageResolver: packageResolver
)
do {
let lookup = TypeNameLookup(context: declContext, name: "check1", evaluator: context.evaluator)
XCTAssertEqual(try lookup.lookup(), WITType.u32)
}
do {
let lookup = TypeNameLookup(context: declContext, name: "check2", evaluator: context.evaluator)
XCTAssertEqual(try lookup.lookup(), WITType.string)
}
}
func testLoadDependenciesWithVersion() throws {
let loader = InMemoryLoader()
let (mainPackage, packageResolver) = try PackageResolver.parse(
directory: .init(
fileName: "pkg",
node: [
"apple.wit": """
package fruit:apple
interface apple {
use fruit:banana/types@1.0.0.{size as size-1}
use fruit:banana/types@2.0.0.{size as size-2}
type check1 = size-1
type check2 = size-2
}
""",
"deps": [
"banana-1.0.0": [
"banana.wit": """
package fruit:banana@1.0.0
interface types {
type size = u32
}
"""
],
"banana-2.0.0": [
"banana.wit": """
package fruit:banana@2.0.0
interface types {
type size = u8
}
"""
],
],
]
),
loader: loader
)
let context = SemanticsContext(rootPackage: mainPackage, packageResolver: packageResolver)
let (appleIface, sourceFile) = try context.lookupInterface(name: "apple", contextPackage: mainPackage)
let declContext = DeclContext(
kind: .interface(appleIface, sourceFile: sourceFile, context: .package(mainPackage.packageName)),
packageUnit: mainPackage,
packageResolver: packageResolver
)
do {
let lookup = TypeNameLookup(context: declContext, name: "check1", evaluator: context.evaluator)
XCTAssertEqual(try lookup.lookup(), .u32)
}
do {
let lookup = TypeNameLookup(context: declContext, name: "check2", evaluator: context.evaluator)
XCTAssertEqual(try lookup.lookup(), .u8)
}
}
}
|