xref: /aosp_15_r20/external/pigweed/pw_ide/ts/pigweed-vscode/src/project.test.ts (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1// Copyright 2024 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7//     https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14
15import { writeFileSync, mkdirSync } from 'fs';
16import { join } from 'path';
17
18import {
19  findPigweedJsonAbove,
20  findPigweedJsonBelow,
21  inferPigweedProjectRoot,
22} from './project';
23
24import { makeTempDir } from './testUtils';
25
26describe('find pigweed.json', () => {
27  test('find pigweed.json 1 level above', async () => {
28    const dir = await makeTempDir();
29    writeFileSync(join(dir, 'pigweed.json'), '');
30    const nestedDir = join(dir, 'nested');
31    mkdirSync(nestedDir);
32    const projectRoot = findPigweedJsonAbove(nestedDir);
33    expect(projectRoot).toBe(dir);
34  });
35
36  test('find pigweed.json 2 levels above', async () => {
37    const dir = await makeTempDir();
38    writeFileSync(join(dir, 'pigweed.json'), '');
39    const nestedDir = join(dir, 'nested');
40    mkdirSync(nestedDir);
41    const nestedDir2 = join(dir, 'nested', 'again');
42    mkdirSync(nestedDir2);
43    const projectRoot = findPigweedJsonAbove(nestedDir2);
44    expect(projectRoot).toBe(dir);
45  });
46
47  test('find pigweed.json 1 level below', async () => {
48    const dir = await makeTempDir();
49    const nestedDir = join(dir, 'nested');
50    mkdirSync(nestedDir);
51    writeFileSync(join(nestedDir, 'pigweed.json'), '');
52    const projectRoot = await findPigweedJsonBelow(dir);
53    expect(projectRoot[0]).toBe(nestedDir);
54  });
55
56  test('find pigweed.json 2 levels below', async () => {
57    const dir = await makeTempDir();
58    const nestedDir = join(dir, 'nested');
59    mkdirSync(nestedDir);
60    const nestedDir2 = join(dir, 'nested', 'again');
61    mkdirSync(nestedDir2);
62    writeFileSync(join(nestedDir2, 'pigweed.json'), '');
63    const projectRoot = await findPigweedJsonBelow(dir);
64    expect(projectRoot[0]).toBe(nestedDir2);
65  });
66
67  test('find pigweed.json below returns all found', async () => {
68    const dir = await makeTempDir();
69    const nestedDir = join(dir, 'nested');
70    mkdirSync(nestedDir);
71    writeFileSync(join(nestedDir, 'pigweed.json'), '');
72    const nestedDir2 = join(dir, 'nested', 'again');
73    mkdirSync(nestedDir2);
74    writeFileSync(join(nestedDir2, 'pigweed.json'), '');
75    const projectRoot = await findPigweedJsonBelow(dir);
76    expect(projectRoot.length).toBe(2);
77    expect(projectRoot).toContain(nestedDir);
78    expect(projectRoot).toContain(nestedDir2);
79  });
80
81  test('pigweed.json from above is preferred over below', async () => {
82    const dir = await makeTempDir();
83    writeFileSync(join(dir, 'pigweed.json'), '');
84
85    const workspaceDir = join(dir, 'workspace');
86    mkdirSync(workspaceDir);
87
88    const pigweedDir = join(workspaceDir, 'pigweed');
89    mkdirSync(pigweedDir);
90    writeFileSync(join(pigweedDir, 'pigweed.json'), '');
91
92    const projectRoot = await inferPigweedProjectRoot(dir);
93    expect(projectRoot).toBe(dir);
94  });
95});
96