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 @@
+
+
+