feat: solution for 'Повторный экзамен #2: Граф с рефлексией на код'

This commit is contained in:
2026-06-30 11:39:42 +03:00
parent b09469b196
commit 224adca90a
5 changed files with 327 additions and 56 deletions
+79
View File
@@ -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);
});
});