///
import Member = dSeeder.Member;
import TreeNode = dSeeder.TreeNode;
import TreeNodeMarriage = dSeeder.TreeNodeMarriage;
import SeederOptions = dSeeder.SeederOptions;
//TODO: replace with namespace import or replace testing framework
///
import assert = Chai;
//TODO: convert to namespace import
import MockMembers from './data/mockMembers';
const testData = MockMembers.getAll();
let dTreeSampleData: any;
fetch('./data/dTreeSampleData.json')
.then((response) => dTreeSampleData = response.json());
//TODO: convert to namespace import
import dTreeSampleMockMembers from './data/dTreeSampleMockMembers';
describe('_private._getRelatives', () => {
it('gets empty array, should throw error', () => {
// Assert
assert.throws(() => dSeeder._private._getRelatives([]));
})
it('gets no targetId, should return an empty array', () => {
// Assert
assert.throws(() => dSeeder._private._getRelatives(testData));
})
describe('gets targetId', () => {
it('target is not in data, should throw error', () => {
// Arrange
const targetId = 999;
// Assert
assert.throw(() => dSeeder._private._getRelatives(testData, targetId));
})
describe('target is in data', () => {
it('should return array with no duplicates', () => {
// Arrange
const targetId = MockMembers.LyarraStark.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const duplicateIds = resultIds.filter((value, index) =>
index !== resultIds.indexOf(value));
assert.isEmpty(duplicateIds);
})
it('should return array including target with their parent ids', () => {
// Arrange
const targetId = MockMembers.EdardStark.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const target = result.find((member) => member.id === targetId);
assert.isDefined(target);
assert.isNotNull(target?.parent1Id);
assert.isNotNull(target?.parent2Id);
})
describe('has parents', () => {
it('only has parent1, should return array including parent1 without their parent ids', () => {
// Arrange
const targetId = MockMembers.OnlyHasParent1.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const target = result.find((member) => member.id === targetId);
assert.include(resultIds, target?.parent1Id);
assert.isNull(target?.parent2Id);
const parent1 = result.find((member) => member.id === target?.parent1Id);
assert.isNull(parent1?.parent1Id);
assert.isNull(parent1?.parent2Id);
})
it('only has parent2, should return array including parent2 without their parent ids', () => {
// Arrange
// Arrange
const targetId = MockMembers.OnlyHasParent2.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const target = result.find((member) => member.id === targetId);
assert.isNull(target?.parent1Id);
assert.include(resultIds, target?.parent2Id);
const parent2 = result.find((member) => member.id === target?.parent2Id);
assert.isNull(parent2?.parent1Id);
assert.isNull(parent2?.parent2Id);
})
it('has 2 parents, should return array including both parents without their parent ids', () => {
// Arrange
const targetId = MockMembers.LyannaStark.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const target = result.find((member) => member.id === targetId);
assert.include(resultIds, target?.parent1Id);
assert.include(resultIds, target?.parent2Id);
const parent1 = result.find((member) => member.id === target?.parent1Id);
const parent2 = result.find((member) => member.id === target?.parent2Id);
assert.isNull(parent1?.parent1Id);
assert.isNull(parent1?.parent2Id);
assert.isNull(parent2?.parent1Id);
assert.isNull(parent2?.parent2Id);
})
it('parent1 is not in data, should throw error', () => {
// Arrange
const targetId = MockMembers.Parent1IsNotInData.id;
// Assert
assert.throw(() => dSeeder._private._getRelatives(testData, targetId));
})
it('parent2 is not in data, should throw error', () => {
// Arrange
const targetId = MockMembers.Parent2IsNotInData.id;
// Assert
assert.throw(() => dSeeder._private._getRelatives(testData, targetId));
})
})
describe('has siblings', () => {
it('with same parent order, should return array including siblings with their parent ids', () => {
// Arrange
const targetId = MockMembers.Child.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
assert.include(resultIds, MockMembers.SiblingWithParentsInSameOrder.id);
const sibling = result.find((member) => member.id === MockMembers.SiblingWithParentsInSameOrder.id);
assert.isNotNull(sibling?.parent1Id);
assert.isNotNull(sibling?.parent2Id);
})
it('with reverse parent order, should return array including siblings with their parent ids', () => {
// Arrange
const targetId = MockMembers.Child.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
assert.include(resultIds, MockMembers.SiblingWithParentsInReverseOrder.id);
const sibling = result.find((member) => member.id === MockMembers.SiblingWithParentsInSameOrder.id);
assert.isNotNull(sibling?.parent1Id);
assert.isNotNull(sibling?.parent2Id);
})
it('with both parent orders, should return array including siblings with their parent ids', () => {
// Arrange
const targetId = MockMembers.Child.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const sibling1Id = MockMembers.SiblingWithParentsInSameOrder.id;
const sibling2Id = MockMembers.SiblingWithParentsInReverseOrder.id;
assert.include(resultIds, sibling1Id);
assert.include(resultIds, sibling2Id);
const sibling1 = result.find((member) => member.id === sibling1Id);
const sibling2 = result.find((member) => member.id === sibling2Id);
assert.isNotNull(sibling1?.parent1Id);
assert.isNotNull(sibling1?.parent2Id);
assert.isNotNull(sibling2?.parent1Id);
assert.isNotNull(sibling2?.parent2Id);
})
})
describe('has children', () => {
it('should return array including children with their parent ids', () => {
// Arrange
const targetId = MockMembers.LyarraStark.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const child1Id = MockMembers.EdardStark.id;
const child2Id = MockMembers.LyannaStark.id;
assert.include(resultIds, child1Id);
assert.include(resultIds, child2Id);
const child1 = result.find((member) => member.id === child1Id);
const child2 = result.find((member) => member.id === child2Id);
assert.isNotNull(child1?.parent1Id);
assert.isNotNull(child1?.parent2Id);
assert.isNotNull(child2?.parent1Id);
assert.isNotNull(child2?.parent2Id);
})
it('should return array including children\'s other parent without their parent ids', () => {
// Arrange
const targetId = MockMembers.EdardStark.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const spouseId = MockMembers.CatelynStark.id;
assert.include(resultIds, spouseId);
const spouse = result.find((member) => member.id === spouseId);
assert.isNull(spouse?.parent1Id);
assert.isNull(spouse?.parent2Id);
})
it('other parent (parent1) is not in data, should throw error', () => {
// Arrange
const targetId = MockMembers.Parent1IsNotInData.id;
// Assert
assert.throw(() => dSeeder._private._getRelatives(testData, targetId));
})
it('other parent (parent2) is not in data, should throw error', () => {
// Arrange
const targetId = MockMembers.Parent2IsNotInData.id;
// Assert
assert.throw(() => dSeeder._private._getRelatives(testData, targetId));
})
})
describe('has grandchildren', () => {
it('should return array including grandchildren with their parent ids', () => {
// Arrange
const targetId = MockMembers.LyarraStark.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const grandchildId = MockMembers.AryaStark.id;
assert.include(resultIds, grandchildId);
const grandchild = result.find((member) => member.id === grandchildId);
assert.isNotNull(grandchild?.parent1Id);
assert.isNotNull(grandchild?.parent2Id);
})
it('should return array including grandchildren\'s other parents without their parent ids', () => {
// Arrange
const targetId = MockMembers.LyarraStark.id;
// Act
const result = dSeeder._private._getRelatives(testData, targetId);
// Assert
const resultIds = result.map((member) => member.id);
const grandchildOtherParentId = MockMembers.CatelynStark.id;
assert.include(resultIds, grandchildOtherParentId);
const grandchildOtherParent = result.find((member) => member.id === grandchildOtherParentId);
assert.isNull(grandchildOtherParent?.parent1Id);
assert.isNull(grandchildOtherParent?.parent2Id);
})
})
})
})
});
describe('_private._combineIntoMarriages', () => {
it('gets empty array, should throw error', () => {
// Assert
assert.throws(() => dSeeder._private._combineIntoMarriages([]));
})
it('gets 1 member, returns array of 1 treeNode', () => {
// Arrange
const members = [MockMembers.AryaStark];
// Act
const result = dSeeder._private._combineIntoMarriages(members);
// Assert
assert.isArray(result);
assert.lengthOf(result, 1);
assert.equal(result[0].id, members[0].id);
})
it('gets only members with no parents, should throw error', () => {
// Arrange
const members = [
{
id: 1,
name: 'No Parents 1',
parent1Id: null,
parent2Id: null
},
{
id: 2,
name: 'No Parents 2',
parent1Id: null,
parent2Id: null
}
];
// Assert
assert.throw(() => dSeeder._private._combineIntoMarriages(members));
})
it('gets 1 child with 1 parent as parent1, returns array of 1 tree node with 1 marrige to no spouse and 1 child', () => {
// Arrange
const parent = {
id: 1,
name: 'Parent',
parent1Id: null,
parent2Id: null
};
const child = {
id: 2,
name: 'Child',
parent1Id: 1,
parent2Id: null
};
const members = [parent, child];
// Act
const result = dSeeder._private._combineIntoMarriages(members);
// Assert
assert.isNull(result[0].marriages[0].spouse);
assert.equal(result[0].marriages[0].children[0].id, child.id);
assert.equal(result[0].marriages[0].children.length, 1);
})
it('gets 1 child with 1 parent as parent2, returns array of 1 tree node with 1 marrige to no spouse and 1 child', () => {
// Arrange
const parent = {
id: 1,
name: 'Parent',
parent1Id: null,
parent2Id: null
};
const child = {
id: 2,
name: 'Child',
parent1Id: null,
parent2Id: 1
};
const members = [parent, child];
// Act
const result = dSeeder._private._combineIntoMarriages(members);
// Assert
assert.isNull(result[0].marriages[0].spouse);
assert.equal(result[0].marriages[0].children[0].id, child.id);
assert.equal(result[0].marriages[0].children.length, 1);
})
it('gets 1 child with 2 parents, returns array of 1 tree node with 1 marrige to spouse with 1 child', () => {
// Arrange
const parent1 = {
id: 1,
name: 'Parent1',
parent1Id: null,
parent2Id: null
};
const parent2 = {
id: 2,
name: 'Parent2',
parent1Id: null,
parent2Id: null
};
const child = {
id: 3,
name: 'Child',
parent1Id: 1,
parent2Id: 2
};
const members = [parent1, parent2, child];
// Act
const result = dSeeder._private._combineIntoMarriages(members);
// Assert
assert.equal(result[0].marriages[0].spouse?.id, parent2.id);
assert.equal(result[0].marriages[0].children[0].id, child.id);
assert.equal(result[0].marriages[0].children.length, 1);
})
it('gets 1 parent with multiple spouses and children, returns array of 1 tree node with multiple marriages to spouses with children', () => {
// Arrange
const parent = {
id: 1,
name: 'Parent',
parent1Id: null,
parent2Id: null
};
const spouse1 = {
id: 2,
name: 'Spouse1',
parent1Id: null,
parent2Id: null
};
const spouse2 = {
id: 3,
name: 'Spouse2',
parent1Id: null,
parent2Id: null
};
const child1 = {
id: 4,
name: 'Child1',
parent1Id: 1,
parent2Id: 2
};
const child2 = {
id: 5,
name: 'Child2',
parent1Id: 1,
parent2Id: 3
};
const members = [parent, spouse1, spouse2, child1, child2];
// Act
const result = dSeeder._private._combineIntoMarriages(members);
// Assert
assert.equal(result.length, 1);
assert.equal(result[0].marriages.length, 2);
assert.equal(result[0].marriages[0].spouse?.id, spouse1.id);
assert.equal(result[0].marriages[0].children[0].id, child1.id);
assert.equal(result[0].marriages[0].children.length, 1);
assert.equal(result[0].marriages[1].spouse?.id, spouse2.id);
assert.equal(result[0].marriages[1].children[0].id, child2.id);
assert.equal(result[0].marriages[1].children.length, 1);
})
it('gets 2 children with 2 parents in different order, returns array of 1 tree node with 1 marriage to spouse with 2 children', () => {
// Arrange
const parent1 = {
id: 1,
name: 'Parent1',
parent1Id: null,
parent2Id: null
};
const parent2 = {
id: 2,
name: 'Parent2',
parent1Id: null,
parent2Id: null
};
const child1 = {
id: 3,
name: 'Child1',
parent1Id: 1,
parent2Id: 2
};
const child2 = {
id: 4,
name: 'Child2',
parent1Id: 2,
parent2Id: 1
};
const members = [parent1, parent2, child1, child2];
// Act
const result = dSeeder._private._combineIntoMarriages(members);
// Assert
assert.equal(result.length, 1);
assert.equal(result[0].marriages[0].spouse?.id, parent2.id);
assert.equal(result[0].marriages[0].children[0].id, child1.id);
assert.equal(result[0].marriages[0].children[1].id, child2.id);
assert.equal(result[0].marriages[0].children.length, 2);
})
});
describe('_private._coalesce', () => {
it('gets empty array, should throw error', () => {
// Assert
assert.throws(() => dSeeder._private._coalesce([]));
})
it('gets 1 generation, should return valid tree', () => {
// Arrange
const node = new TreeNode(MockMembers.EdardStark);
const marriage = new TreeNodeMarriage();
marriage.spouse = new TreeNode(MockMembers.CatelynStark);
marriage.children = [
new TreeNode(MockMembers.AryaStark),
new TreeNode(MockMembers.BranStark),
new TreeNode(MockMembers.RickonStark),
new TreeNode(MockMembers.SansaStark)
];
node.marriages.push(marriage);
// Assert
const result = dSeeder._private._coalesce([node]);
// Assert
assert.equal(result.length, 1);
assert.equal(result[0].id, MockMembers.EdardStark.id);
assert.equal(result[0].marriages[0].spouse?.id, MockMembers.CatelynStark.id);
assert.deepEqual(result[0].marriages[0].children.map(child => child.id), marriage.children.map(child => child.id));
})
it('gets 2 generations, should return valid tree', () => {
// Arrange
const nedStarkNode = new TreeNode(MockMembers.EdardStark);
const nedStarkMarriage = new TreeNodeMarriage();
nedStarkMarriage.spouse = new TreeNode(MockMembers.CatelynStark);
nedStarkMarriage.children = [
new TreeNode(MockMembers.AryaStark),
new TreeNode(MockMembers.BranStark),
new TreeNode(MockMembers.RickonStark),
new TreeNode(MockMembers.SansaStark)
];
nedStarkNode.marriages.push(nedStarkMarriage);
const rickardStarkNode = new TreeNode(MockMembers.RickardStark);
const rickardStarkMarriage = new TreeNodeMarriage();
rickardStarkMarriage.spouse = new TreeNode(MockMembers.LyarraStark);
rickardStarkMarriage.children = [
new TreeNode(MockMembers.EdardStark),
new TreeNode(MockMembers.BenjenStark),
new TreeNode(MockMembers.BrandonStark),
new TreeNode(MockMembers.LyannaStark)
];
rickardStarkNode.marriages.push(rickardStarkMarriage);
// Assert
const result = dSeeder._private._coalesce([nedStarkNode, rickardStarkNode]);
// Assert
assert.equal(result.length, 1);
assert.equal(result[0].id, MockMembers.RickardStark.id);
assert.equal(result[0].marriages[0].spouse?.id, MockMembers.LyarraStark.id);
assert.deepEqual(result[0].marriages[0].children.map(child => child.id), rickardStarkMarriage.children.map(child => child.id));
const nedStarkInResult = result[0].marriages[0].children.find(child => child.id === MockMembers.EdardStark.id);
assert.equal(nedStarkInResult?.marriages[0].spouse?.id, MockMembers.CatelynStark.id);
assert.deepEqual(nedStarkInResult?.marriages[0].children.map(child => child.id), nedStarkMarriage.children.map(child => child.id));
})
it('descendent is listed as spouse in marriage, should pivot node on marriage and return valid tree', () => {
// Arrange
const gen1Node = new TreeNode(MockMembers.Gen1Parent1);
const gen1Marriage = new TreeNodeMarriage();
gen1Marriage.spouse = new TreeNode(MockMembers.Gen1Parent2);
gen1Marriage.children = [new TreeNode(MockMembers.Gen1ChildGen2Parent2)];
gen1Node.marriages.push(gen1Marriage);
const gen2Node = new TreeNode(MockMembers.Gen2Parent1);
const gen2Marriage = new TreeNodeMarriage();
gen2Marriage.spouse = new TreeNode(MockMembers.Gen1ChildGen2Parent2);
gen2Marriage.children = [new TreeNode(MockMembers.Gen2ChildGen3Parent2)];
gen2Node.marriages.push(gen2Marriage);
// Act
const result = dSeeder._private._coalesce([gen1Node, gen2Node]);
// Assert
assert.equal(result.length, 1);
const gen1InResult = result[0];
assert.equal(gen1InResult.id, MockMembers.Gen1Parent1.id);
assert.equal(gen1InResult.marriages[0].spouse?.id, MockMembers.Gen1Parent2.id);
assert.deepEqual(gen1InResult.marriages[0].children.map(child => child.id), gen1Marriage.children.map(child => child.id));
const gen2InResult = gen1InResult.marriages[0].children.find(child => child.id === MockMembers.Gen1ChildGen2Parent2.id);
assert.equal(gen2InResult?.marriages[0].spouse?.id, MockMembers.Gen2Parent1.id);
assert.deepEqual(gen2InResult?.marriages[0].children.map(child => child.id), gen2Marriage.children.map(child => child.id));
})
it('gets 5 generations, should return valid tree', () => {
// Arrange
const gen1Node = new TreeNode(MockMembers.Gen1Parent1);
const gen1Marriage = new TreeNodeMarriage();
gen1Marriage.spouse = new TreeNode(MockMembers.Gen1Parent2);
gen1Marriage.children = [new TreeNode(MockMembers.Gen1ChildGen2Parent2)];
gen1Node.marriages.push(gen1Marriage);
const gen2Node = new TreeNode(MockMembers.Gen1ChildGen2Parent2);
const gen2Marriage = new TreeNodeMarriage();
gen2Marriage.spouse = new TreeNode(MockMembers.Gen2Parent1);
gen2Marriage.children = [new TreeNode(MockMembers.Gen2ChildGen3Parent2)];
gen2Node.marriages.push(gen2Marriage);
const gen3Node = new TreeNode(MockMembers.Gen2ChildGen3Parent2);
const gen3Marriage = new TreeNodeMarriage();
gen3Marriage.spouse = new TreeNode(MockMembers.Gen3Parent1);
gen3Marriage.children = [new TreeNode(MockMembers.Gen3ChildGen4Parent1)];
gen3Node.marriages.push(gen3Marriage);
const gen4Node = new TreeNode(MockMembers.Gen3ChildGen4Parent1);
const gen4Marriage = new TreeNodeMarriage();
gen4Marriage.spouse = new TreeNode(MockMembers.Gen4Parent2);
gen4Marriage.children = [new TreeNode(MockMembers.Gen4ChildGen5Parent1)];
gen4Node.marriages.push(gen4Marriage);
const gen5Node = new TreeNode(MockMembers.Gen4ChildGen5Parent1);
const gen5Marriage = new TreeNodeMarriage();
gen5Marriage.spouse = new TreeNode(MockMembers.Gen5Parent2);
gen5Marriage.children = [new TreeNode(MockMembers.Gen5Child)];
gen5Node.marriages.push(gen5Marriage);
// Assert
const result = dSeeder._private._coalesce([gen1Node, gen2Node, gen3Node, gen4Node, gen5Node]);
// Assert
assert.equal(result.length, 1);
const gen1InResult = result[0];
assert.equal(gen1InResult.id, MockMembers.Gen1Parent1.id);
assert.equal(gen1InResult.marriages[0].spouse?.id, MockMembers.Gen1Parent2.id);
assert.deepEqual(gen1InResult.marriages[0].children.map(child => child.id), gen1Marriage.children.map(child => child.id));
const gen2InResult = gen1InResult.marriages[0].children.find(child => child.id === MockMembers.Gen1ChildGen2Parent2.id);
assert.equal(gen2InResult?.marriages[0].spouse?.id, MockMembers.Gen2Parent1.id);
assert.deepEqual(gen2InResult?.marriages[0].children.map(child => child.id), gen2Marriage.children.map(child => child.id));
const gen3InResult = gen2InResult?.marriages[0].children.find(child => child.id === MockMembers.Gen2ChildGen3Parent2.id);
assert.equal(gen3InResult?.marriages[0].spouse?.id, MockMembers.Gen3Parent1.id);
assert.deepEqual(gen3InResult?.marriages[0].children.map(child => child.id), gen3Marriage.children.map(child => child.id));
const gen4InResult = gen3InResult?.marriages[0].children.find(child => child.id === MockMembers.Gen3ChildGen4Parent1.id);;
assert.equal(gen4InResult?.marriages[0].spouse?.id, MockMembers.Gen4Parent2.id);
assert.deepEqual(gen4InResult?.marriages[0].children.map(child => child.id), gen4Marriage.children.map(child => child.id));
const gen5InResult = gen4InResult?.marriages[0].children.find(child => child.id === MockMembers.Gen4ChildGen5Parent1.id);;
assert.equal(gen5InResult?.marriages[0].spouse?.id, MockMembers.Gen5Parent2.id);
assert.deepEqual(gen5InResult?.marriages[0].children.map(child => child.id), gen5Marriage.children.map(child => child.id));
})
it('gets multiple root nodes, should throw error', () => {
// Arrange
const nodes = [
new TreeNode(MockMembers.AryaStark),
new TreeNode(MockMembers.Parent1)
];
// Assert
assert.throws(() => dSeeder._private._coalesce(nodes));
})
it('get duplicate tree nodes, should throw error', () => {
// Arrange
const nodes = [
new TreeNode(MockMembers.AryaStark),
new TreeNode(MockMembers.AryaStark)
];
// Assert
assert.throws(() => dSeeder._private._coalesce(nodes));
})
});
describe('seed', () => {
it('gets empty array, should throw error', () => {
// Assert
assert.throws(() => dSeeder.seed([], 0));
})
it('gets dTree sample data, should return valid tree in JSON format', () => {
// Act
const result = dSeeder.seed(dTreeSampleMockMembers.getAll(), dTreeSampleMockMembers.NiclasSuperLongsurname.id);
// Assert
assert.typeOf(result, 'array');
assert.equal(JSON.stringify(result), JSON.stringify(dTreeSampleData));
})
describe('target has no parents', () => {
it('target should have depthOffset 1', () => {
// Arrange
const targetId = MockMembers.Gen1Parent1.id;
// Act
const result = dSeeder.seed(testData, targetId);
// Assert
const gen1: TreeNode[] = result;
assert.include(gen1.map(node => node.id), targetId);
assert.isTrue(gen1.every((node) => node.depthOffset === 1));
})
it('target has spouse, target and spouse should have same depthOffset', () => {
// Arrange
const targetId = MockMembers.Gen1Parent1.id;
const spouseId = MockMembers.Gen1Parent2.id;
// Act
const result = dSeeder.seed(testData, targetId);
// Assert
const gen1: TreeNode[] = result;
assert.include(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse?.id)), spouseId);
const targetDepthOffset = gen1.find(node => node.id === targetId)?.depthOffset as number;
assert.isTrue(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.depthOffset === targetDepthOffset));
})
it('target has children, children should have depthOffset 1 more than target', () => {
// Arrange
const targetId = MockMembers.Gen1Parent1.id;
const childId = MockMembers.Gen1ChildGen2Parent2.id;
// Act
const result = dSeeder.seed(testData, targetId);
// Assert
const gen1: TreeNode[] = result;
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.include(gen2.map((node) => node.id), childId);
const targetDepthOffset = gen1.find(node => node.id === targetId)?.depthOffset as number;
assert.isTrue(gen2.every((node) => node.depthOffset === targetDepthOffset + 1));
})
})
describe('target has parents', () => {
it('target should have depthOffset 2', () => {
// Arrange
const targetId = MockMembers.Gen1ChildGen2Parent2.id;
// Act
const result = dSeeder.seed(testData, targetId);
// Assert
const gen1: TreeNode[] = result;
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.include(gen2.map(node => node.id), targetId);
assert.isTrue(gen2.every((node) => node.depthOffset === 2));
})
it('target has spouse, target and spouse should have same depthOffset', () => {
// Arrange
const targetId = MockMembers.Gen1ChildGen2Parent2.id;
const spouseId = MockMembers.Gen2Parent1.id;
// Act
const result = dSeeder.seed(testData, targetId);
// Assert
const gen1: TreeNode[] = result;
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.include(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse?.id)), spouseId);
const targetDepthOffset = gen2.find(node => node.id === targetId)?.depthOffset as number;
assert.isTrue(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.depthOffset === targetDepthOffset));
})
it('target has children, children should have depthOffset 1 more than target', () => {
// Arrange
const targetId = MockMembers.Gen1ChildGen2Parent2.id;
const childId = MockMembers.Gen2ChildGen3Parent2.id;
// Act
const result = dSeeder.seed(testData, targetId);
// Assert
const gen1: TreeNode[] = result;
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
const gen3 = gen2.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.include(gen3.map((node) => node.id), childId);
const targetDepthOffset = gen2.find(node => node.id === targetId)?.depthOffset as number;
assert.isTrue(gen3.every((node) => node.depthOffset === targetDepthOffset + 1));
})
})
it('should add depthOffset to each generation', () => {
// Act
const result = dSeeder.seed(testData, MockMembers.Gen1ChildGen2Parent2.id);
// Assert
const gen1: TreeNode[] = result;
assert.isTrue(gen1.every((node) => node.depthOffset === 1));
assert.isTrue(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.depthOffset == 1));
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen2.every((node) => node.depthOffset === 2));
assert.isTrue(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.depthOffset === 2));
const gen3 = gen2.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen3.every((node) => node.depthOffset === 3));
assert.isTrue(gen3.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.depthOffset === 3));
const gen4 = gen3.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen4.every((node) => node.depthOffset === 4));
assert.isTrue(gen4.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.depthOffset === 4));
const gen5 = gen4.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen5.every((node) => node.depthOffset === 5));
assert.isTrue(gen5.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.depthOffset === 5));
})
describe('gets SeederOptions object', () => {
it('gets callback for class, populates class for each node', () => {
// Arrange
const options: SeederOptions = {
class: (member: Member) => member.id.toString()
};
// Act
const result = dSeeder.seed(testData, MockMembers.Gen1ChildGen2Parent2.id, options);
// Assert
const gen1: TreeNode[] = result;
assert.isTrue(gen1.every((node) => node.class === node?.id.toString()));
assert.isTrue(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class == spouse?.id.toString()));
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen2.every((node) => node.depthOffset === 2));
assert.isTrue(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class === spouse?.id.toString()));
const gen3 = gen2.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen3.every((node) => node.depthOffset === 3));
assert.isTrue(gen3.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class === spouse?.id.toString()));
const gen4 = gen3.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen4.every((node) => node.depthOffset === 4));
assert.isTrue(gen4.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class === spouse?.id.toString()));
const gen5 = gen4.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen5.every((node) => node.depthOffset === 5));
assert.isTrue(gen5.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class === spouse?.id.toString()));
})
it('gets no callback for class, class should be an empty string for each node', () => {
// Act
const result = dSeeder.seed(testData, MockMembers.Gen1ChildGen2Parent2.id, {});
// Assert
const gen1: TreeNode[] = result;
assert.isTrue(gen1.every((node) => node.class === ''));
assert.isTrue(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class == ''));
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen2.every((node) => node.depthOffset === 2));
assert.isTrue(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class === ''));
const gen3 = gen2.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen3.every((node) => node.depthOffset === 3));
assert.isTrue(gen3.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class === ''));
const gen4 = gen3.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen4.every((node) => node.depthOffset === 4));
assert.isTrue(gen4.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class === ''));
const gen5 = gen4.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen5.every((node) => node.depthOffset === 5));
assert.isTrue(gen5.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.class === ''));
})
it('gets callback for textClass, populates textClass for each node', () => {
// Arrange
const options: SeederOptions = {
textClass: (member: Member) => member.id.toString()
};
// Act
const result = dSeeder.seed(testData, MockMembers.Gen1ChildGen2Parent2.id, options);
// Assert
const gen1: TreeNode[] = result;
assert.isTrue(gen1.every((node) => node.textClass === node.id.toString()));
assert.isTrue(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass == spouse?.id.toString()));
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen2.every((node) => node.depthOffset === 2));
assert.isTrue(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass === spouse?.id.toString()));
const gen3 = gen2.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen3.every((node) => node.depthOffset === 3));
assert.isTrue(gen3.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass === spouse?.id.toString()));
const gen4 = gen3.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen4.every((node) => node.depthOffset === 4));
assert.isTrue(gen4.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass === spouse?.id.toString()));
const gen5 = gen4.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen5.every((node) => node.depthOffset === 5));
assert.isTrue(gen5.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass === spouse?.id.toString()));
})
it('gets no callback for textClass, textClass should be an empty string for each node', () => {
// Act
const result = dSeeder.seed(testData, MockMembers.Gen1ChildGen2Parent2.id, {});
// Assert
const gen1: TreeNode[] = result;
assert.isTrue(gen1.every((node) => node.textClass === ''));
assert.isTrue(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass == ''));
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen2.every((node) => node.depthOffset === 2));
assert.isTrue(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass === ''));
const gen3 = gen2.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen3.every((node) => node.depthOffset === 3));
assert.isTrue(gen3.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass === ''));
const gen4 = gen3.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen4.every((node) => node.depthOffset === 4));
assert.isTrue(gen4.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass === ''));
const gen5 = gen4.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen5.every((node) => node.depthOffset === 5));
assert.isTrue(gen5.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.textClass === ''));
})
it('gets callback for extra, populates extra for each node', () => {
// Arrange
const options: SeederOptions = {
extra: (member: Member) => {
return { id: member.id.toString() };
}
};
// Act
const result = dSeeder.seed(testData, MockMembers.Gen1ChildGen2Parent2.id, options);
// Assert
const gen1: TreeNode[] = result;
assert.isTrue(gen1.every((node) => node.extra.toString() === { id: node.id.toString() }.toString()));
assert.isTrue(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.extra.toString() === { id: spouse?.id.toString() }.toString()));
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen2.every((node) => node.depthOffset === 2));
assert.isTrue(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.extra.toString() === { id: spouse?.id.toString() }.toString()));
const gen3 = gen2.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen3.every((node) => node.depthOffset === 3));
assert.isTrue(gen3.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.extra.toString() === { id: spouse?.id.toString() }.toString()));
const gen4 = gen3.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen4.every((node) => node.depthOffset === 4));
assert.isTrue(gen4.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.extra.toString() === { id: spouse?.id.toString() }.toString()));
const gen5 = gen4.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen5.every((node) => node.depthOffset === 5));
assert.isTrue(gen5.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) => spouse?.extra.toString() === { id: spouse?.id.toString() }.toString()));
})
it('gets no callback for extra, extra should be an empty object for each node', () => {
// Act
const result = dSeeder.seed(testData, MockMembers.Gen1ChildGen2Parent2.id, {});
// Assert
const gen1: TreeNode[] = result;
assert.isTrue(gen1.every((node) => Object.keys(node.extra).length === 0));
assert.isTrue(gen1.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) =>
spouse?.extra == undefined
? false
: Object.keys(spouse.extra).length === 0));
const gen2 = gen1.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen2.every((node) => node.depthOffset === 2));
assert.isTrue(gen2.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) =>
spouse?.extra == undefined
? false
: Object.keys(spouse.extra).length === 0));
const gen3 = gen2.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen3.every((node) => node.depthOffset === 3));
assert.isTrue(gen3.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) =>
spouse?.extra == undefined
? false
: Object.keys(spouse.extra).length === 0));
const gen4 = gen3.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen4.every((node) => node.depthOffset === 4));
assert.isTrue(gen4.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) =>
spouse?.extra == undefined
? false
: Object.keys(spouse.extra).length === 0));
const gen5 = gen4.flatMap((node) => node.marriages.flatMap((marriage) => marriage.children));
assert.isTrue(gen5.every((node) => node.depthOffset === 5));
assert.isTrue(gen5.flatMap((node) => node.marriages.map((marriage) => marriage.spouse)).every((spouse) =>
spouse?.extra == undefined
? false
: Object.keys(spouse.extra).length === 0));
})
})
});