feat: add browser-based MuJoCo simulation platform
build / setup (compute matrix) (pull_request) Has been cancelled
build / ${{ matrix.label }} (pull_request) Has been cancelled
build / macos-15-arm64-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-studio (pull_request) Has been cancelled
build / ubuntu-24.04-gcc-14-studio (pull_request) Has been cancelled
build / windows-2025-ninja-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-wasm (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-mjx (pull_request) Has been cancelled
lint / pre-commit (pull_request) Has been cancelled

This commit is contained in:
2026-08-20 15:12:08 +08:00
parent b45b15d153
commit 1eb05132f1
45 changed files with 5584 additions and 18 deletions
@@ -0,0 +1,31 @@
import {render,screen,within} from '@testing-library/react';
import {buildProjectTree,ProjectTree} from './ProjectTree';
const files=[
{path:'robot/meshes/arm.obj',size:2048},
{path:'robot/model.xml',size:512},
{path:'robot/textures/body.png',size:4096},
{path:'README.txt',size:10},
];
describe('ProjectTree',()=>{
it('按路径构建多级目录,并将目录排在文件前面',()=>{
const tree=buildProjectTree(files);
expect(tree.map(node=>[node.kind,node.name])).toEqual([['directory','robot'],['file','README.txt']]);
const robot=tree[0];
expect(robot.children?.map(node=>[node.kind,node.name])).toEqual([
['directory','meshes'],['directory','textures'],['file','model.xml'],
]);
expect(robot.children?.[0].children?.[0]).toMatchObject({kind:'file',name:'arm.obj',path:'robot/meshes/arm.obj'});
});
it('以可折叠目录显示文件名,而不是平铺完整路径',()=>{
render(<ProjectTree files={files} entries={[{path:'robot/model.xml',format:'mjcf',label:'model'}]} selectedEntry="robot/model.xml"/>);
const tree=screen.getByRole('navigation',{name:'工程文件树'});
expect(within(tree).getByText('robot')).toBeVisible();
expect(within(tree).getByText('meshes')).toBeVisible();
expect(within(tree).getByText('arm.obj')).toBeVisible();
expect(within(tree).queryByText('robot/meshes/arm.obj')).not.toBeInTheDocument();
expect(within(tree).getByText('mjcf')).toBeVisible();
});
});