mirror of
https://github.com/abhigyanpatwari/GitNexus.git
synced 2026-10-03 02:21:44 +00:00
* docs: add Objective-C fork provider notes * feat(objective-c): add deterministic provider and grammar * feat(objective-c): finalize provider MVP * fix(objective-c): harden provider integration * fix(objective-c): normalize bare macro markers * docs(objective-c): integrate provider documentation * fix(objective-c): harden resolution and header classification * fix(objective-c): complete provider follow-ups * fix: address Objective-C review follow-ups * chore: format Objective-C grammar sources * fix(objective-c): harden review follow-ups * Address PR review feedback (#3179) Keep Objective-C chunking and macro recovery aligned with the grammar, and stop Community MEMBER_OF edges from leaking into symbol context. Co-authored-by: Cursor <cursoragent@cursor.com> * Address follow-up review on ObjC chunking and language fallback. Keep preprocessor directive text from changing file-scope brace depth, group real ivar nodes, skip header modifiers, and restore Rakefile/Gemfile detection through getLanguageFromFilename. Co-authored-by: Cursor <cursoragent@cursor.com> * Parse Objective-C headers with the objc grammar in embeddings. ensureAndParse and structural extraction now use the same content classifier as ingest, including method snippets from .h files, so Protocol/Category/Class chunks are not re-parsed as C++. Co-authored-by: Cursor <cursoragent@cursor.com> * Address PR review feedback (#3179) Keep file-scope macro elision off C line splices and @interface/@protocol/@implementation bodies, and attach ivar attributes to the following instance variable when chunking. Co-authored-by: Cursor <cursoragent@cursor.com> * chore(bench): rebaseline Objective-C CSV emit * feat(objective-c): add workspace resolution and linear emit benches Plain .h files are classified as C++, so the ObjC pass could not resolve #import of those headers. Load a C/C#-style workspace once per pass, and keep protocol-candidate USES linear. Refs #3179 Co-authored-by: Cursor <cursoragent@cursor.com> * Address PR review feedback (#3179) - Compare LadybugDB labels() as a scalar when excluding Community MEMBER_OF edges. - Walk superclass members, skip file-static C sibling defs, and ignore comments in ObjC header/macro scans. Note: pre-existing failure in objective-c-provider integration (worker-pool ready timeout) not addressed by this PR. Co-authored-by: Cursor <cursoragent@cursor.com> * Address PR review feedback (#3179) Emit Objective-C declaration captures so compilation-unit siblings can share header/implementation bindings, and keep class vs protocol visibility groups distinct. Note: pre-existing failure in worker-pool startup (GITNEXUS_WORKER_READY_TIMEOUT_MS) not addressed by this PR. Co-authored-by: Cursor <cursoragent@cursor.com> * Address PR review feedback (#3179) Emit every comma-separated property/ivar declarator, and count @interface after a multiline block comment closes so in-declaration macros stay intact. Note: pre-existing failure in worker-pool startup (GITNEXUS_WORKER_READY_TIMEOUT_MS) not addressed by this PR. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: ximengkai <ximengkai@soyoung.com> Co-authored-by: Gergő Magyar <gergomagyar@icloud.com> Co-authored-by: Gergo Magyar <gergomagyar0@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>
118 lines
3.8 KiB
TypeScript
118 lines
3.8 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import {
|
|
NODE_COLORS,
|
|
NODE_SIZES,
|
|
COMMUNITY_COLORS,
|
|
getCommunityColor,
|
|
DEFAULT_VISIBLE_LABELS,
|
|
FILTERABLE_LABELS,
|
|
ALL_EDGE_TYPES,
|
|
DEFAULT_VISIBLE_EDGES,
|
|
EDGE_INFO,
|
|
} from '../../src/lib/constants';
|
|
|
|
describe('NODE_COLORS', () => {
|
|
it('has a color for every node label used in NODE_SIZES', () => {
|
|
for (const label of Object.keys(NODE_SIZES)) {
|
|
expect(NODE_COLORS).toHaveProperty(label);
|
|
expect(NODE_COLORS[label as keyof typeof NODE_COLORS]).toMatch(/^#[0-9a-f]{6}$/i);
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('NODE_SIZES', () => {
|
|
it('gives Project the largest size', () => {
|
|
const maxLabel = Object.entries(NODE_SIZES).reduce((a, b) => (a[1] > b[1] ? a : b));
|
|
expect(maxLabel[0]).toBe('Project');
|
|
});
|
|
|
|
it('gives structural nodes larger sizes than code nodes', () => {
|
|
expect(NODE_SIZES.Folder).toBeGreaterThan(NODE_SIZES.Function);
|
|
expect(NODE_SIZES.File).toBeGreaterThan(NODE_SIZES.Variable);
|
|
});
|
|
});
|
|
|
|
describe('getCommunityColor', () => {
|
|
it('returns valid hex colors', () => {
|
|
for (let i = 0; i < 20; i++) {
|
|
expect(getCommunityColor(i)).toMatch(/^#[0-9a-f]{6}$/i);
|
|
}
|
|
});
|
|
|
|
it('wraps around the palette', () => {
|
|
const paletteSize = COMMUNITY_COLORS.length;
|
|
expect(getCommunityColor(0)).toBe(getCommunityColor(paletteSize));
|
|
expect(getCommunityColor(1)).toBe(getCommunityColor(paletteSize + 1));
|
|
});
|
|
});
|
|
|
|
describe('DEFAULT_VISIBLE_LABELS', () => {
|
|
it('includes common structural and code labels', () => {
|
|
expect(DEFAULT_VISIBLE_LABELS).toContain('File');
|
|
expect(DEFAULT_VISIBLE_LABELS).toContain('Function');
|
|
expect(DEFAULT_VISIBLE_LABELS).toContain('Class');
|
|
});
|
|
|
|
it('excludes noisy labels by default', () => {
|
|
expect(DEFAULT_VISIBLE_LABELS).not.toContain('Variable');
|
|
expect(DEFAULT_VISIBLE_LABELS).not.toContain('Import');
|
|
});
|
|
});
|
|
|
|
describe('FILTERABLE_LABELS', () => {
|
|
it('includes all newly added node types', () => {
|
|
expect(FILTERABLE_LABELS).toContain('Enum');
|
|
expect(FILTERABLE_LABELS).toContain('Type');
|
|
expect(FILTERABLE_LABELS).toContain('Decorator');
|
|
expect(FILTERABLE_LABELS).toContain('Variable');
|
|
expect(FILTERABLE_LABELS).toContain('Protocol');
|
|
expect(FILTERABLE_LABELS).toContain('Category');
|
|
});
|
|
|
|
it('every filterable label has a defined color in NODE_COLORS', () => {
|
|
for (const label of FILTERABLE_LABELS) {
|
|
expect(NODE_COLORS).toHaveProperty(label);
|
|
expect(NODE_COLORS[label as keyof typeof NODE_COLORS]).toMatch(/^#[0-9a-f]{6}$/i);
|
|
}
|
|
});
|
|
|
|
it('every filterable label has a defined size in NODE_SIZES', () => {
|
|
for (const label of FILTERABLE_LABELS) {
|
|
expect(NODE_SIZES).toHaveProperty(label);
|
|
expect(NODE_SIZES[label as keyof typeof NODE_SIZES]).toBeGreaterThan(0);
|
|
}
|
|
});
|
|
|
|
it('has no duplicate entries', () => {
|
|
const unique = new Set(FILTERABLE_LABELS);
|
|
expect(unique.size).toBe(FILTERABLE_LABELS.length);
|
|
});
|
|
|
|
it('is a subset of DEFAULT_VISIBLE_LABELS plus togglable labels', () => {
|
|
const allKnown = new Set(Object.keys(NODE_COLORS));
|
|
for (const label of FILTERABLE_LABELS) {
|
|
expect(allKnown.has(label)).toBe(true);
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('edge types', () => {
|
|
it('ALL_EDGE_TYPES contains all EDGE_INFO keys', () => {
|
|
const edgeInfoKeys = Object.keys(EDGE_INFO).sort();
|
|
const allEdgeTypes = [...ALL_EDGE_TYPES].sort();
|
|
expect(edgeInfoKeys).toEqual(allEdgeTypes);
|
|
});
|
|
|
|
it('DEFAULT_VISIBLE_EDGES is a subset of ALL_EDGE_TYPES', () => {
|
|
for (const type of DEFAULT_VISIBLE_EDGES) {
|
|
expect(ALL_EDGE_TYPES).toContain(type);
|
|
}
|
|
});
|
|
|
|
it('EDGE_INFO entries have color and label', () => {
|
|
for (const info of Object.values(EDGE_INFO)) {
|
|
expect(info.color).toMatch(/^#[0-9a-f]{6}$/i);
|
|
expect(info.label.length).toBeGreaterThan(0);
|
|
}
|
|
});
|
|
});
|