@@ -53,7 +53,7 @@ import { PythonResultResolver } from './common/resultResolver';
5353import { onDidSaveTextDocument } from '../../common/vscodeApis/workspaceApis' ;
5454import { IEnvironmentVariablesProvider } from '../../common/variables/types' ;
5555import { ProjectAdapter } from './common/projectAdapter' ;
56- import { generateProjectId , createProjectDisplayName } from './common/projectUtils' ;
56+ import { getProjectId , createProjectDisplayName } from './common/projectUtils' ;
5757import { PythonProject , PythonEnvironment } from '../../envExt/types' ;
5858import { getEnvExtApi , useEnvExtension } from '../../envExt/api.internal' ;
5959
@@ -66,11 +66,19 @@ type TriggerType = EventPropertyType[TriggerKeyType];
6666export class PythonTestController implements ITestController , IExtensionSingleActivationService {
6767 public readonly supportedWorkspaceTypes = { untrustedWorkspace : false , virtualWorkspace : false } ;
6868
69+ /**
70+ * Feature flag for project-based testing.
71+ * Set to true to enable multi-project testing support (Phases 2-4 must be complete).
72+ * Default: false (use legacy single-workspace mode)
73+ */
74+ private readonly useProjectBasedTesting = false ;
75+
6976 // Legacy: Single workspace test adapter per workspace (backward compatibility)
7077 private readonly testAdapters : Map < Uri , WorkspaceTestAdapter > = new Map ( ) ;
7178
7279 // === NEW: PROJECT-BASED STATE ===
73- // Map of workspace URI -> Map of project ID -> ProjectAdapter
80+ // Map of workspace URI -> Map of project URI string -> ProjectAdapter
81+ // Note: Project URI strings match Python Environments extension's Map<string, PythonProject> keys
7482 private readonly workspaceProjects : Map < Uri , Map < string , ProjectAdapter > > = new Map ( ) ;
7583
7684 // TODO: Phase 3-4 - Add these maps when implementing discovery and execution:
@@ -227,8 +235,8 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
227235 public async activate ( ) : Promise < void > {
228236 const workspaces : readonly WorkspaceFolder [ ] = this . workspaceService . workspaceFolders || [ ] ;
229237
230- // Try to use project-based testing if environment extension is enabled
231- if ( useEnvExtension ( ) ) {
238+ // Try to use project-based testing if feature flag is enabled AND environment extension is available
239+ if ( this . useProjectBasedTesting && useEnvExtension ( ) ) {
232240 traceInfo ( '[test-by-project] Activating project-based testing mode' ) ;
233241
234242 // Use Promise.allSettled to allow partial success in multi-root workspaces
@@ -239,10 +247,11 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
239247 // Discover projects in this workspace
240248 const projects = await this . discoverWorkspaceProjects ( workspace . uri ) ;
241249
242- // Create map for this workspace
250+ // Create map for this workspace, keyed by project URI (matches Python Environments extension)
243251 const projectsMap = new Map < string , ProjectAdapter > ( ) ;
244252 projects . forEach ( ( project ) => {
245- projectsMap . set ( project . projectId , project ) ;
253+ const projectKey = getProjectId ( project . projectUri ) ;
254+ projectsMap . set ( projectKey , project ) ;
246255 } ) ;
247256
248257 traceInfo (
@@ -374,8 +383,8 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
374383 traceInfo (
375384 `[test-by-project] Creating project adapter for: ${ pythonProject . name } at ${ pythonProject . uri . fsPath } ` ,
376385 ) ;
377- // Generate unique project ID
378- const projectId = generateProjectId ( pythonProject ) ;
386+ // Use project URI as the project ID (no hashing needed)
387+ const projectId = getProjectId ( pythonProject . uri ) ;
379388
380389 // Resolve the Python environment
381390 const envExtApi = await getEnvExtApi ( ) ;
@@ -456,8 +465,8 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
456465 uri : workspaceUri ,
457466 } ;
458467
459- // Use workspace URI as project ID for default project
460- const projectId = `default- ${ workspaceUri . fsPath } ` ;
468+ // Use workspace URI as the project ID
469+ const projectId = getProjectId ( workspaceUri ) ;
461470
462471 return {
463472 projectId,
0 commit comments