@@ -28,21 +28,38 @@ import * as Telemetry from '../../../client/telemetry';
28
28
import { EventName } from '../../../client/telemetry/constants' ;
29
29
30
30
interface IExperimentLsCombination {
31
- inExperiment : boolean ;
31
+ experiment ?: TryPylance ;
32
32
lsType : LanguageServerType ;
33
33
shouldShowBanner : boolean ;
34
34
}
35
35
const testData : IExperimentLsCombination [ ] = [
36
- { inExperiment : true , lsType : LanguageServerType . None , shouldShowBanner : true } ,
37
- { inExperiment : true , lsType : LanguageServerType . Microsoft , shouldShowBanner : true } ,
38
- { inExperiment : true , lsType : LanguageServerType . Node , shouldShowBanner : false } ,
39
- { inExperiment : true , lsType : LanguageServerType . Jedi , shouldShowBanner : false } ,
40
- { inExperiment : false , lsType : LanguageServerType . None , shouldShowBanner : false } ,
41
- { inExperiment : false , lsType : LanguageServerType . Microsoft , shouldShowBanner : false } ,
42
- { inExperiment : false , lsType : LanguageServerType . Node , shouldShowBanner : false } ,
43
- { inExperiment : false , lsType : LanguageServerType . Jedi , shouldShowBanner : false }
36
+ { experiment : undefined , lsType : LanguageServerType . None , shouldShowBanner : false } ,
37
+ { experiment : undefined , lsType : LanguageServerType . Microsoft , shouldShowBanner : false } ,
38
+ { experiment : undefined , lsType : LanguageServerType . Node , shouldShowBanner : false } ,
39
+ { experiment : undefined , lsType : LanguageServerType . Jedi , shouldShowBanner : false } ,
40
+
41
+ { experiment : TryPylance . experiment , lsType : LanguageServerType . None , shouldShowBanner : true } ,
42
+ { experiment : TryPylance . experiment , lsType : LanguageServerType . Microsoft , shouldShowBanner : true } ,
43
+ { experiment : TryPylance . experiment , lsType : LanguageServerType . Node , shouldShowBanner : false } ,
44
+ { experiment : TryPylance . experiment , lsType : LanguageServerType . Jedi , shouldShowBanner : false } ,
45
+
46
+ { experiment : TryPylance . jediPrompt1 , lsType : LanguageServerType . None , shouldShowBanner : false } ,
47
+ { experiment : TryPylance . jediPrompt1 , lsType : LanguageServerType . Microsoft , shouldShowBanner : false } ,
48
+ { experiment : TryPylance . jediPrompt1 , lsType : LanguageServerType . Node , shouldShowBanner : false } ,
49
+ { experiment : TryPylance . jediPrompt1 , lsType : LanguageServerType . Jedi , shouldShowBanner : true } ,
50
+
51
+ { experiment : TryPylance . jediPrompt2 , lsType : LanguageServerType . None , shouldShowBanner : false } ,
52
+ { experiment : TryPylance . jediPrompt2 , lsType : LanguageServerType . Microsoft , shouldShowBanner : false } ,
53
+ { experiment : TryPylance . jediPrompt2 , lsType : LanguageServerType . Node , shouldShowBanner : false } ,
54
+ { experiment : TryPylance . jediPrompt2 , lsType : LanguageServerType . Jedi , shouldShowBanner : true }
44
55
] ;
45
56
57
+ const expectedMessages = {
58
+ [ TryPylance . experiment ] : Pylance . proposePylanceMessage ( ) ,
59
+ [ TryPylance . jediPrompt1 ] : 'Message for jediPrompt1' ,
60
+ [ TryPylance . jediPrompt2 ] : 'Message for jediPrompt2'
61
+ } ;
62
+
46
63
suite ( 'Propose Pylance Banner' , ( ) => {
47
64
let config : typemoq . IMock < IConfigurationService > ;
48
65
let appShell : typemoq . IMock < IApplicationShell > ;
@@ -51,7 +68,6 @@ suite('Propose Pylance Banner', () => {
51
68
let sendTelemetryStub : sinon . SinonStub ;
52
69
let telemetryEvent : { eventName : EventName ; properties : { userAction : string } } | undefined ;
53
70
54
- const message = Pylance . proposePylanceMessage ( ) ;
55
71
const yes = Pylance . tryItNow ( ) ;
56
72
const no = Common . bannerLabelNo ( ) ;
57
73
const later = Pylance . remindMeLater ( ) ;
@@ -81,43 +97,59 @@ suite('Propose Pylance Banner', () => {
81
97
} ) ;
82
98
83
99
testData . forEach ( ( t ) => {
84
- test ( `${ t . inExperiment ? 'In' : 'Not in' } experiment and "python.languageServer": "${ t . lsType } " should ${
100
+ test ( `${ t . experiment } experiment and "python.languageServer": "${ t . lsType } " should ${
85
101
t . shouldShowBanner ? 'show' : 'not show'
86
102
} banner`, async ( ) => {
87
103
settings . setup ( ( x ) => x . languageServer ) . returns ( ( ) => t . lsType ) ;
88
- const testBanner = preparePopup ( true , appShell . object , appEnv . object , config . object , t . inExperiment , false ) ;
89
- const actual = await testBanner . shouldShowBanner ( ) ;
90
- expect ( actual ) . to . be . equal ( t . shouldShowBanner , `shouldShowBanner() returned ${ actual } ` ) ;
104
+ const testBanner = preparePopup ( true , appShell . object , appEnv . object , config . object , t . experiment , false ) ;
105
+ const message = await testBanner . getPromptMessage ( ) ;
106
+ if ( t . experiment ) {
107
+ expect ( message ) . to . be . equal (
108
+ t . shouldShowBanner ? expectedMessages [ t . experiment ] : undefined ,
109
+ `getPromptMessage() returned ${ message } `
110
+ ) ;
111
+ } else {
112
+ expect ( message ) . to . be . equal ( undefined , `message should be undefined` ) ;
113
+ }
91
114
} ) ;
92
115
} ) ;
93
116
testData . forEach ( ( t ) => {
94
117
test ( `When Pylance is installed, banner should not be shown when "python.languageServer": "${ t . lsType } "` , async ( ) => {
95
118
settings . setup ( ( x ) => x . languageServer ) . returns ( ( ) => t . lsType ) ;
96
- const testBanner = preparePopup ( true , appShell . object , appEnv . object , config . object , t . inExperiment , true ) ;
97
- const actual = await testBanner . shouldShowBanner ( ) ;
98
- expect ( actual ) . to . be . equal ( false , `shouldShowBanner () returned ${ actual } ` ) ;
119
+ const testBanner = preparePopup ( true , appShell . object , appEnv . object , config . object , t . experiment , true ) ;
120
+ const message = await testBanner . getPromptMessage ( ) ;
121
+ expect ( message ) . to . be . equal ( undefined , `getPromptMessage () returned ${ message } ` ) ;
99
122
} ) ;
100
123
} ) ;
101
124
test ( 'Do not show banner when it is disabled' , async ( ) => {
125
+ settings . setup ( ( x ) => x . languageServer ) . returns ( ( ) => LanguageServerType . Microsoft ) ;
102
126
appShell
103
127
. setup ( ( a ) =>
104
128
a . showInformationMessage (
105
- typemoq . It . isValue ( message ) ,
129
+ typemoq . It . isValue ( expectedMessages [ TryPylance . experiment ] ) ,
106
130
typemoq . It . isValue ( yes ) ,
107
131
typemoq . It . isValue ( no ) ,
108
132
typemoq . It . isValue ( later )
109
133
)
110
134
)
111
135
. verifiable ( typemoq . Times . never ( ) ) ;
112
- const testBanner = preparePopup ( false , appShell . object , appEnv . object , config . object , true , false ) ;
136
+ const testBanner = preparePopup (
137
+ false ,
138
+ appShell . object ,
139
+ appEnv . object ,
140
+ config . object ,
141
+ TryPylance . experiment ,
142
+ false
143
+ ) ;
113
144
await testBanner . showBanner ( ) ;
114
145
appShell . verifyAll ( ) ;
115
146
} ) ;
116
147
test ( 'Clicking No should disable the banner' , async ( ) => {
148
+ settings . setup ( ( x ) => x . languageServer ) . returns ( ( ) => LanguageServerType . Microsoft ) ;
117
149
appShell
118
150
. setup ( ( a ) =>
119
151
a . showInformationMessage (
120
- typemoq . It . isValue ( message ) ,
152
+ typemoq . It . isValue ( expectedMessages [ TryPylance . experiment ] ) ,
121
153
typemoq . It . isValue ( yes ) ,
122
154
typemoq . It . isValue ( no ) ,
123
155
typemoq . It . isValue ( later )
@@ -127,7 +159,14 @@ suite('Propose Pylance Banner', () => {
127
159
. verifiable ( typemoq . Times . once ( ) ) ;
128
160
appShell . setup ( ( a ) => a . openUrl ( getPylanceExtensionUri ( appEnv . object ) ) ) . verifiable ( typemoq . Times . never ( ) ) ;
129
161
130
- const testBanner = preparePopup ( true , appShell . object , appEnv . object , config . object , true , false ) ;
162
+ const testBanner = preparePopup (
163
+ true ,
164
+ appShell . object ,
165
+ appEnv . object ,
166
+ config . object ,
167
+ TryPylance . experiment ,
168
+ false
169
+ ) ;
131
170
await testBanner . showBanner ( ) ;
132
171
133
172
expect ( testBanner . enabled ) . to . be . equal ( false , 'Banner should be permanently disabled when user clicked No' ) ;
@@ -140,10 +179,11 @@ suite('Propose Pylance Banner', () => {
140
179
} ) ;
141
180
} ) ;
142
181
test ( 'Clicking Later should disable banner in session' , async ( ) => {
182
+ settings . setup ( ( x ) => x . languageServer ) . returns ( ( ) => LanguageServerType . Microsoft ) ;
143
183
appShell
144
184
. setup ( ( a ) =>
145
185
a . showInformationMessage (
146
- typemoq . It . isValue ( message ) ,
186
+ typemoq . It . isValue ( expectedMessages [ TryPylance . experiment ] ) ,
147
187
typemoq . It . isValue ( yes ) ,
148
188
typemoq . It . isValue ( no ) ,
149
189
typemoq . It . isValue ( later )
@@ -153,7 +193,14 @@ suite('Propose Pylance Banner', () => {
153
193
. verifiable ( typemoq . Times . once ( ) ) ;
154
194
appShell . setup ( ( a ) => a . openUrl ( getPylanceExtensionUri ( appEnv . object ) ) ) . verifiable ( typemoq . Times . never ( ) ) ;
155
195
156
- const testBanner = preparePopup ( true , appShell . object , appEnv . object , config . object , true , false ) ;
196
+ const testBanner = preparePopup (
197
+ true ,
198
+ appShell . object ,
199
+ appEnv . object ,
200
+ config . object ,
201
+ TryPylance . experiment ,
202
+ false
203
+ ) ;
157
204
await testBanner . showBanner ( ) ;
158
205
159
206
expect ( testBanner . enabled ) . to . be . equal (
@@ -171,10 +218,11 @@ suite('Propose Pylance Banner', () => {
171
218
} ) ;
172
219
} ) ;
173
220
test ( 'Clicking Yes opens the extension marketplace entry' , async ( ) => {
221
+ settings . setup ( ( x ) => x . languageServer ) . returns ( ( ) => LanguageServerType . Microsoft ) ;
174
222
appShell
175
223
. setup ( ( a ) =>
176
224
a . showInformationMessage (
177
- typemoq . It . isValue ( message ) ,
225
+ typemoq . It . isValue ( expectedMessages [ TryPylance . experiment ] ) ,
178
226
typemoq . It . isValue ( yes ) ,
179
227
typemoq . It . isValue ( no ) ,
180
228
typemoq . It . isValue ( later )
@@ -184,7 +232,14 @@ suite('Propose Pylance Banner', () => {
184
232
. verifiable ( typemoq . Times . once ( ) ) ;
185
233
appShell . setup ( ( a ) => a . openUrl ( getPylanceExtensionUri ( appEnv . object ) ) ) . verifiable ( typemoq . Times . once ( ) ) ;
186
234
187
- const testBanner = preparePopup ( true , appShell . object , appEnv . object , config . object , true , false ) ;
235
+ const testBanner = preparePopup (
236
+ true ,
237
+ appShell . object ,
238
+ appEnv . object ,
239
+ config . object ,
240
+ TryPylance . experiment ,
241
+ false
242
+ ) ;
188
243
await testBanner . showBanner ( ) ;
189
244
190
245
expect ( testBanner . enabled ) . to . be . equal ( false , 'Banner should be permanently disabled after opening store URL' ) ;
@@ -205,7 +260,7 @@ function preparePopup(
205
260
appShell : IApplicationShell ,
206
261
appEnv : IApplicationEnvironment ,
207
262
config : IConfigurationService ,
208
- inExperiment : boolean ,
263
+ experiment : TryPylance | undefined ,
209
264
pylanceInstalled : boolean
210
265
) : ProposePylanceBanner {
211
266
const myfactory = typemoq . Mock . ofType < IPersistentStateFactory > ( ) ;
@@ -237,7 +292,12 @@ function preparePopup(
237
292
} ) ;
238
293
239
294
const experiments = typemoq . Mock . ofType < IExperimentService > ( ) ;
240
- experiments . setup ( ( x ) => x . inExperiment ( TryPylance . experiment ) ) . returns ( ( ) => Promise . resolve ( inExperiment ) ) ;
295
+ Object . values ( TryPylance ) . forEach ( ( exp ) => {
296
+ experiments . setup ( ( x ) => x . inExperiment ( exp ) ) . returns ( ( ) => Promise . resolve ( exp === experiment ) ) ;
297
+ if ( exp !== TryPylance . experiment ) {
298
+ experiments . setup ( ( x ) => x . getExperimentValue ( exp ) ) . returns ( ( ) => Promise . resolve ( expectedMessages [ exp ] ) ) ;
299
+ }
300
+ } ) ;
241
301
242
302
const extensions = typemoq . Mock . ofType < IExtensions > ( ) ;
243
303
// tslint:disable-next-line: no-any
0 commit comments