feat: solution for 'Повторный экзамен #2: Граф с рефлексией на код'
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
const { Graph } = require('../src');
|
||||
|
||||
describe('Graph', () => {
|
||||
let g;
|
||||
|
||||
beforeEach(() => {
|
||||
g = new Graph();
|
||||
});
|
||||
|
||||
test('initially empty', () => {
|
||||
expect(g.size()).toBe(0);
|
||||
expect(g.edgesCount()).toBe(0);
|
||||
});
|
||||
|
||||
test('addVertex increases size and adds reflexive edge', () => {
|
||||
g.addVertex('a');
|
||||
expect(g.size()).toBe(1);
|
||||
expect(g.isReflexive()).toBe(true);
|
||||
expect(g.hasEdge('a', 'a')).toBe(true);
|
||||
});
|
||||
|
||||
test('addEdge connects vertices and updates adjacency', () => {
|
||||
g.addEdge('a', 'b');
|
||||
expect(g.size()).toBe(2);
|
||||
expect(g.hasEdge('a', 'b')).toBe(true);
|
||||
expect(g.hasEdge('b', 'a')).toBe(true);
|
||||
expect(g.getNeighbors('a')).toEqual(expect.arrayContaining(['a', 'b']));
|
||||
expect(g.getNeighbors('b')).toEqual(expect.arrayContaining(['a', 'b']));
|
||||
});
|
||||
|
||||
test('removeEdge removes connection', () => {
|
||||
g.addEdge('a', 'b');
|
||||
g.removeEdge('a', 'b');
|
||||
expect(g.hasEdge('a', 'b')).toBe(false);
|
||||
expect(g.hasEdge('b', 'a')).toBe(false);
|
||||
// self-loops remain
|
||||
expect(g.hasEdge('a', 'a')).toBe(true);
|
||||
expect(g.hasEdge('b', 'b')).toBe(true);
|
||||
});
|
||||
|
||||
test('removeVertex removes vertex and incident edges', () => {
|
||||
g.addEdge('a', 'b');
|
||||
g.addEdge('a', 'c');
|
||||
g.removeVertex('a');
|
||||
expect(g.size()).toBe(2);
|
||||
expect(g.hasEdge('b', 'a')).toBe(false);
|
||||
expect(g.hasEdge('c', 'a')).toBe(false);
|
||||
expect(g.hasEdge('b', 'c')).toBe(false);
|
||||
});
|
||||
|
||||
test('edges and edgesCount work correctly', () => {
|
||||
g.addEdge('a', 'b');
|
||||
g.addEdge('b', 'c');
|
||||
g.addEdge('c', 'a');
|
||||
expect(g.edgesCount()).toBe(3);
|
||||
const edges = g.edges();
|
||||
expect(edges).toEqual(expect.arrayContaining([
|
||||
['a', 'b'],
|
||||
['b', 'c'],
|
||||
['c', 'a']
|
||||
]));
|
||||
});
|
||||
|
||||
test('self-loop handling', () => {
|
||||
g.addVertex('x');
|
||||
expect(g.hasEdge('x', 'x')).toBe(true);
|
||||
g.removeEdge('x', 'x');
|
||||
expect(g.hasEdge('x', 'x')).toBe(false);
|
||||
});
|
||||
|
||||
test('reflexivity can be toggled', () => {
|
||||
g.addVertex('p');
|
||||
g.addVertex('q');
|
||||
g.removeReflexive();
|
||||
expect(g.isReflexive()).toBe(false);
|
||||
g.makeReflexive();
|
||||
expect(g.isReflexive()).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user