1// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers 2// 3// SPDX-License-Identifier: MPL-2.0 4 5import Testing 6 7@testable import PterodactylBuild 8@testable import PterodactylSyntax 9@testable import llbuild2fx 10 11struct BuildTests { 12 @Test 13 func testBlockLayout() async throws { 14 let code = """ 15 theory Foo where 16 foo : bar 17 baz : sdf 18 """ 19 20 var lexer = PterodactylSyntax.Lexer(input: code) 21 let flatTokens = lexer.tokenize() 22 let blockTokens = BlockLayoutProcessor(tokens: flatTokens).layout() 23 24 #expect( 25 blockTokens.map(\.kind) == [ 26 .keyword(.theory), .whitespace, .identifier, .whitespace, .keyword(.where), .blockBegin, .newline, .whitespace, .blockSep, .identifier, .whitespace, 27 .punctuation(.colon), 28 .whitespace, .identifier, .newline, .whitespace, .blockSep, .identifier, .whitespace, .punctuation(.colon), .whitespace, .identifier, .blockEnd, .eof 29 ]) 30 } 31 32 @Test 33 func testParse() async throws { 34 let code = """ 35 theory Foo where 36 asdf : asdf 37 """ 38 39 var lexer = PterodactylSyntax.Lexer(input: code) 40 let flatTokens = lexer.tokenize() 41 let blockTokens = BlockLayoutProcessor(tokens: flatTokens).layout() 42 var parser = Parser(source: code, tokens: blockTokens) 43 Document.parse(&parser, recovery: []) 44 45 #expect(parser.diagnostics.isEmpty) 46 } 47 48 @Test 49 func testImports() async throws { 50 let group = LLBMakeDefaultDispatchGroup() 51 let db = LLBInMemoryCASDatabase(group: group) 52 let functionCache = FXInMemoryFunctionCache(group: group) 53 let executor = FXLocalExecutor() 54 let engine = FXEngine(group: group, db: db, functionCache: functionCache, executor: executor) 55 let client = LLBCASFSClient(db) 56 let ctx = Context() 57 58 let declTree = LLBDeclFileTree.dir( 59 [ 60 "src": .dir([ 61 "bar.ext": .file(contents: Array("hello world".utf8)), 62 "foo.ext": .file(contents: Array("import bar".utf8)), 63 "baz.ext": .file(contents: Array("import foo".utf8)) 64 ]) 65 ] 66 ) 67 68 let treeID: LLBDataID = try await client.store(declTree, ctx).get() 69 let dependencyGraph = try await engine.build(key: Keys.SourceTree.GetDependencyGraph(sourceTreeId: treeID), ctx).get() 70 let foo = UnitName(basename: "foo") 71 let bar = UnitName(basename: "bar") 72 let baz = UnitName(basename: "baz") 73 74 #expect( 75 dependencyGraph.edges == [ 76 bar: [], 77 foo: [bar], 78 baz: [foo] 79 ] 80 ) 81 82 let dependenciesOfBaz = try await engine.build(key: Keys.SourceTree.GetDependencies(sourceTreeId: treeID, unitName: baz), ctx).get() 83 #expect(dependenciesOfBaz == [foo, bar]) 84 return 85 } 86}