diff --git a/__test__/FileSystem/__snapshots__/file.test.ts.snap b/__test__/FileSystem/__snapshots__/file.test.ts.snap new file mode 100644 index 000000000..538076267 --- /dev/null +++ b/__test__/FileSystem/__snapshots__/file.test.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`changev 1`] = `"[1,[\\"BlockTableRecord\\",1,0,1,[\\"Line\\",1,1,1,[2,3,4],[0,0,0]]]]"`; + +exports[`测试创建 1`] = `"[1,-1,1,[]]"`; + +exports[`测试创建 2`] = `"[1,-1,0]"`; + +exports[`测试创建 3`] = `"[1,null,0]"`; + +exports[`测试创建 4`] = `"[1,[]]"`; + +exports[`测试创建 5`] = `"[1,\\"\\",\\"\\",\\"\\"]"`; + +exports[`测试创建 6`] = `"[1,-1,1,[0,0,0],[0,0,0]]"`; + +exports[`测试创建 7`] = `"[1,\\"\\",\\"\\",\\"\\"]"`; + +exports[`测试创建 8`] = `"[1,null]"`; + +exports[`测试创建 9`] = `"[1,-1]"`; diff --git a/__test__/FileSystem/file.test.ts b/__test__/FileSystem/file.test.ts index cc8fb7942..a7728bdea 100644 --- a/__test__/FileSystem/file.test.ts +++ b/__test__/FileSystem/file.test.ts @@ -1,5 +1,4 @@ import { Vector3 } from 'three'; - import { AllObjectData, @@ -13,37 +12,68 @@ import Line, ObjectAllDataHistoryRecord, RemoveObjectData, + CADObject, } from '../../src/DatabaseServices/FileSystem'; +function CadObjectToString(obj: CADObject) +{ + let file = new CADFile(); + obj.WriteFile(file); + return file.ToString(); +} + +test('测试创建', () => +{ + for (let C of [AllObjectData, + BlockTableRecord, + CommandHistoryRecord, + CreateObjectData, + HistorycRecord, + Line, + ObjectAllDataHistoryRecord, + RemoveObjectData, + CADObject]) + { + //确保每个对象都被正确的创建 + let obj = CADFactory.CreateObject(C.name /*?*/); + let str = CadObjectToString(obj); + expect(str).toMatchSnapshot(); + + //确保对象正确的反序列化 + let fileNew = new CADFile(); + fileNew.Data = JSON.parse(str); + + let objNew = CADFactory.CreateObject(C.name); + let str2 = CadObjectToString(objNew); + + //确保反序列化之后的数据是正确的 + expect(str).toBe(str2); + } +}); + + test('id分配', () => { let db = new Database(); let line = new Line(); - line.StartPoint = new Vector3(10, 3, 2); + + //对象添加到模型空间 分配id let id = db.ModelSpace.Append(line); - expect(id != undefined).toBeTruthy(); - expect(id.Object === line).toBeTruthy(); + expect(id != undefined).toBeTruthy();//对象已经被创建,所以id被分配 + expect(id.Object === line).toBeTruthy();//对象id指向对象 + //撤销添加 db.hm.Undo(); - expect(id.IsErase).toBeTruthy(); - expect(db.ModelSpace.Cout()).toBe(0); + expect(id.IsErase).toBeTruthy(); //对象已经被删除 + expect(db.ModelSpace.Cout()).toBe(0); //个数应该为0 + //还原对象 db.hm.Redo(); - expect(db.ModelSpace.Cout()).toBe(1); - expect(!id.IsErase).toBeTruthy(); - let file = db.FileWrite(); - - let db2 = new Database(); - db2.FileRead(file); - - console.log(db2.GetObjectId(0)); - - db2.GetObjectId(0).Object.ClassName //? - console.log(db2.ModelSpace.Cout()); - console.log(file); + expect(db.ModelSpace.Cout()).toBe(1); //对象还原 + expect(!id.IsErase).toBeTruthy(); //id指向的对象不被删除 }); @@ -58,12 +88,12 @@ test('changev', () => db.hm.Undo(); db.hm.Redo(); - console.log(id.Object === l1); + expect(id.Object !== l1).toBeTruthy(); //创建对象的撤销和重做后 id指向了新的实体 (id.Object as Line).StartPoint = new Vector3(2, 3, 4); - let file = db.FileWrite(); - console.log(file.ToString()); + + expect(file.ToString()/*?*/).toMatchSnapshot(); }); test('xxx', () => @@ -96,58 +126,19 @@ test('xxx', () => (id1.Object as Line).StartPoint = new Vector3(100, 300, 400); (id1.Object as Line).EndPoint = new Vector3(2000, 3000, 4000); - console.log((id1.Object as Line).StartPoint); - console.log((id1.Object as Line).EndPoint); db.hm.Undo(); - console.log((id1.Object as Line).StartPoint); - console.log((id1.Object as Line).EndPoint); - db.hm.Redo(); - console.log((id1.Object as Line).StartPoint); - console.log((id1.Object as Line).EndPoint); - - let f = new CADFile(); db.hm.WriteFile(f); - f.ToString() //? - let db2 = new Database(); db2.hm.ReadFile(f); let f3 = new CADFile(); db2.hm.WriteFile(f3); - f3.ToString() //? + expect(f3.ToString()).toBe(f.ToString());//对象序列化反序列化后 数据应该一样 }); - -let l = CADFactory.CreateObject("Line"); - -l.ClassName //? - -l.constructor.name //? - -// function createLine() -// { -// for (let i = 0; i < 5000; i++) -// { -// let l = CADFactory.CreateObject("Line") as Line; -// } -// } - -// // createLine(); //?. - - -// function undoRedo() -// { -// for (let i = 0; i < 5000; i++) -// { -// db.hm.Undo(); -// db.hm.Redo(); -// } -// } - -// // undoRedo(); //?. diff --git a/src/DatabaseServices/FileSystem.ts b/src/DatabaseServices/FileSystem.ts index bc19bb077..56a7e9882 100644 --- a/src/DatabaseServices/FileSystem.ts +++ b/src/DatabaseServices/FileSystem.ts @@ -4,19 +4,14 @@ import { Vector3, Line3 } from 'three'; 关于webCAD 文件系统的原型. 包括了对象的保存,撤销,还原. -对象的绘制 更新. - 对象ID更新 引用 -材质字典 - 关于对象的撤销和重做设计. 对象池 增量保存 - 1.应该能够新增和删除图元. 2.新增删除图元应该是可以撤销和重做的. 3.图元更改是可以撤销和重做的. @@ -31,7 +26,6 @@ db.AppendEntity(ent); 当我们删除对象时,尝试只对对象进行标记删除. 当历史记录被优化时,我们尝试对删除的对象进行彻底删除 - ###关于对象的历史记录信息 ->对象创建 @@ -115,7 +109,6 @@ id只有在一个情况下才会更新.跨文档复制时. */ - //CAD对象工厂,通过注册 和暴露的创建方法,动态创建对象 export class CADFactory { @@ -133,6 +126,7 @@ export class CADFactory } } +//可以通过添加装饰器 在类前面(@Factory),自动注册工厂的序列化 export function Factory(target: Object) { CADFactory.RegisterObject(target);