@@ -24,8 +24,10 @@ import {TestElement} from './test-element';
2424export abstract class HarnessEnvironment < E > implements HarnessLoader , LocatorFactory {
2525 protected constructor ( protected rawRootElement : E ) { }
2626
27- // Part of the `HarnessLoader` interface, delegated to concrete implementation.
28- abstract documentRootLocatorFactory ( ) : LocatorFactory ;
27+ // Implemented as part of the `LocatorFactory` interface.
28+ documentRootLocatorFactory ( ) : LocatorFactory {
29+ return this . createEnvironment ( this . getDocumentRoot ( ) ) ;
30+ }
2931
3032 // Implemented as part of the `LocatorFactory` interface.
3133 rootElement ( ) : TestElement {
@@ -34,7 +36,7 @@ export abstract class HarnessEnvironment<E> implements HarnessLoader, LocatorFac
3436
3537 // Implemented as part of the `LocatorFactory` interface.
3638 locatorForRequired ( selector : string ) : AsyncFn < TestElement > ;
37- locatorForRequired < T extends ComponentHarness > ( harness : ComponentHarnessConstructor < T > ) :
39+ locatorForRequired < T extends ComponentHarness > ( harnessType : ComponentHarnessConstructor < T > ) :
3840 AsyncFn < T > ;
3941 locatorForRequired < T extends ComponentHarness > (
4042 arg : string | ComponentHarnessConstructor < T > ) : AsyncFn < TestElement | T > {
@@ -57,7 +59,7 @@ export abstract class HarnessEnvironment<E> implements HarnessLoader, LocatorFac
5759
5860 // Implemented as part of the `LocatorFactory` interface.
5961 locatorForOptional ( selector : string ) : AsyncFn < TestElement | null > ;
60- locatorForOptional < T extends ComponentHarness > ( harness : ComponentHarnessConstructor < T > ) :
62+ locatorForOptional < T extends ComponentHarness > ( harnessType : ComponentHarnessConstructor < T > ) :
6163 AsyncFn < T | null > ;
6264 locatorForOptional < T extends ComponentHarness > (
6365 arg : string | ComponentHarnessConstructor < T > ) : AsyncFn < TestElement | T | null > {
@@ -74,7 +76,8 @@ export abstract class HarnessEnvironment<E> implements HarnessLoader, LocatorFac
7476
7577 // Implemented as part of the `LocatorFactory` interface.
7678 locatorForAll ( selector : string ) : AsyncFn < TestElement [ ] > ;
77- locatorForAll < T extends ComponentHarness > ( harness : ComponentHarnessConstructor < T > ) : AsyncFn < T [ ] > ;
79+ locatorForAll < T extends ComponentHarness > ( harnessType : ComponentHarnessConstructor < T > ) :
80+ AsyncFn < T [ ] > ;
7881 locatorForAll < T extends ComponentHarness > (
7982 arg : string | ComponentHarnessConstructor < T > ) : AsyncFn < TestElement [ ] | T [ ] > {
8083 return async ( ) => {
@@ -88,50 +91,57 @@ export abstract class HarnessEnvironment<E> implements HarnessLoader, LocatorFac
8891 }
8992
9093 // Implemented as part of the `HarnessLoader` interface.
91- requiredHarness < T extends ComponentHarness > ( harness : ComponentHarnessConstructor < T > ) : Promise < T > {
92- return this . locatorForRequired ( harness ) ( ) ;
94+ requiredHarness < T extends ComponentHarness > ( harnessType : ComponentHarnessConstructor < T > ) :
95+ Promise < T > {
96+ return this . locatorForRequired ( harnessType ) ( ) ;
9397 }
9498
9599 // Implemented as part of the `HarnessLoader` interface.
96- optionalHarness < T extends ComponentHarness > ( harness : ComponentHarnessConstructor < T > ) :
97- Promise < T | null > {
98- return this . locatorForOptional ( harness ) ( ) ;
100+ optionalHarness < T extends ComponentHarness > ( harnessType : ComponentHarnessConstructor < T > ) :
101+ Promise < T | null > {
102+ return this . locatorForOptional ( harnessType ) ( ) ;
99103 }
100104
101105 // Implemented as part of the `HarnessLoader` interface.
102- allHarnesses < T extends ComponentHarness > ( harness : ComponentHarnessConstructor < T > ) : Promise < T [ ] > {
103- return this . locatorForAll ( harness ) ( ) ;
106+ allHarnesses < T extends ComponentHarness > ( harnessType : ComponentHarnessConstructor < T > ) :
107+ Promise < T [ ] > {
108+ return this . locatorForAll ( harnessType ) ( ) ;
104109 }
105110
106111 // Implemented as part of the `HarnessLoader` interface.
107112 async findRequired ( selector : string ) : Promise < HarnessLoader > {
108113 const element = await this . getRawElement ( selector ) ;
109114 if ( element ) {
110- return this . createHarnessLoader ( element ) ;
115+ return this . createEnvironment ( element ) ;
111116 }
112117 throw Error ( `Expected to find element matching selector: "${ selector } ", but none was found` ) ;
113118 }
114119
115120 // Implemented as part of the `HarnessLoader` interface.
116121 async findOptional ( selector : string ) : Promise < HarnessLoader | null > {
117122 const element = await this . getRawElement ( selector ) ;
118- return element ? this . createHarnessLoader ( element ) : null ;
123+ return element ? this . createEnvironment ( element ) : null ;
119124 }
120125
121126 // Implemented as part of the `HarnessLoader` interface.
122127 async findAll ( selector : string ) : Promise < HarnessLoader [ ] > {
123- return ( await this . getAllRawElements ( selector ) ) . map ( e => this . createHarnessLoader ( e ) ) ;
128+ return ( await this . getAllRawElements ( selector ) ) . map ( e => this . createEnvironment ( e ) ) ;
129+ }
130+
131+ /** Creates a `ComponentHarness` for the given harness type with the given raw host element. */
132+ protected createComponentHarness < T extends ComponentHarness > (
133+ harnessType : ComponentHarnessConstructor < T > , element : E ) : T {
134+ return new harnessType ( this . createEnvironment ( element ) ) ;
124135 }
125136
137+ /** Gets the root element for the document. */
138+ protected abstract getDocumentRoot ( ) : E ;
139+
126140 /** Creates a `TestElement` from a raw element. */
127141 protected abstract createTestElement ( element : E ) : TestElement ;
128142
129- /** Creates a `ComponentHarness` for the given harness type with the given raw host element. */
130- protected abstract createComponentHarness < T extends ComponentHarness > (
131- harnessType : ComponentHarnessConstructor < T > , element : E ) : T ;
132-
133143 /** Creates a `HarnessLoader` rooted at the given raw element. */
134- protected abstract createHarnessLoader ( element : E ) : HarnessLoader ;
144+ protected abstract createEnvironment ( element : E ) : HarnessEnvironment < E > ;
135145
136146 /**
137147 * Gets the first element matching the given selector under this environment's root element, or
0 commit comments