diff --git a/src/CloverParser.test.ts b/src/CloverParser.test.ts index 4314449a..40614a75 100644 --- a/src/CloverParser.test.ts +++ b/src/CloverParser.test.ts @@ -5,8 +5,8 @@ import { CloverParser } from './CloverParser'; describe('CloverParser test', () => { it('parseClover', async () => { const cf = await CloverParser.parseClover('src/PHPUnit/__tests__/fixtures/test1.clover.xml'); - expect(cf.length).toEqual(2); - const dc = cf[0].generateDetailedCoverage(); + expect(cf.length).toEqual(3); + const dc = cf[1].generateDetailedCoverage(); expect(dc.length).toEqual(6); expect(dc[0].executed).toEqual(2); if (dc[0].location instanceof Position) { diff --git a/src/PHPUnit/Element.test.ts b/src/PHPUnit/Element.test.ts new file mode 100644 index 00000000..6bb35638 --- /dev/null +++ b/src/PHPUnit/Element.test.ts @@ -0,0 +1,60 @@ +import { Element } from './Element'; + +describe('Element Test', () => { + it('querySelectorAll should traverse arrays', () => { + const data = { + coverage: { + project: { + package: [ + { file: { '@_name': 'file1.php' } }, + { file: { '@_name': 'file2.php' } } + ] + } + } + }; + + const element = new Element(data); + const files = element.querySelectorAll('coverage project package file'); + + expect(files.length).toEqual(2); + expect(files[0].getAttribute('name')).toEqual('file1.php'); + expect(files[1].getAttribute('name')).toEqual('file2.php'); + }); + + it('querySelectorAll should handle objects mixed with arrays', () => { + const data = { + coverage: { + project: [ + { file: { '@_name': 'file.php' } }, + { + package: [ + { file: { '@_name': 'file1.php' } }, + ] + }, + { + package: [ + { file: { '@_name': 'file2.php' } } + ] + } + ] + } + }; + + const element = new Element(data); + + const files1 = element.querySelectorAll('coverage project package file'); + expect(files1.length).toEqual(2); + expect(files1[0].getAttribute('name')).toEqual('file1.php'); + expect(files1[1].getAttribute('name')).toEqual('file2.php'); + + const files2 = element.querySelectorAll('coverage project file'); + expect(files2.length).toEqual(1); + expect(files2[0].getAttribute('name')).toEqual('file.php'); + }); + + it('getAttribute should retrieve values', () => { + const data = { '@_version': '1.0' }; + const element = new Element(data); + expect(element.getAttribute('version')).toEqual('1.0'); + }); +}); diff --git a/src/PHPUnit/Element.ts b/src/PHPUnit/Element.ts index 307b8524..4d039a5b 100644 --- a/src/PHPUnit/Element.ts +++ b/src/PHPUnit/Element.ts @@ -35,7 +35,11 @@ export class Element { let current = this.node; while (segments.length > 0) { const segment = segments.shift()!; - current = current[segment] ?? undefined; + if (Array.isArray(current)) { + current = current.flatMap((node) => node[segment] ?? undefined).filter((node) => node !== undefined); + } else { + current = current[segment] ?? undefined; + } if (current === undefined) { return []; diff --git a/src/PHPUnit/__tests__/fixtures/test1.clover.xml b/src/PHPUnit/__tests__/fixtures/test1.clover.xml index da5463bb..9e28f894 100644 --- a/src/PHPUnit/__tests__/fixtures/test1.clover.xml +++ b/src/PHPUnit/__tests__/fixtures/test1.clover.xml @@ -25,6 +25,9 @@ + + +