-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathGraphicsPrewarmService.test.ts
More file actions
126 lines (88 loc) · 5.57 KB
/
GraphicsPrewarmService.test.ts
File metadata and controls
126 lines (88 loc) · 5.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright 2025-2026 The MathWorks, Inc.
import assert from 'assert'
import sinon from 'sinon'
import getMockMvm from '../mocks/Mvm.mock'
import getMockConfigurationManager from '../mocks/ConfigurationManager.mock'
import { IMVM, MatlabMVMConnectionState } from '../../src/mvm/impl/MVM'
import GraphicsPrewarmService from '../../src/lifecycle/GraphicsPrewarmService'
describe('GraphicsPrewarmService', () => {
let mockMvm: any
let mockConfigurationManager: any
beforeEach(() => {
mockMvm = getMockMvm()
mockConfigurationManager = getMockConfigurationManager()
})
afterEach(() => {
sinon.restore()
})
it('should prewarm when enabled and MVM connects to valid release', async () => {
mockConfigurationManager.getConfiguration.resolves({ prewarmGraphics: true})
mockMvm.getMatlabRelease.returns('R2025a')
const graphicsPrewarmService = new GraphicsPrewarmService(mockMvm, mockConfigurationManager)
assert.ok(!graphicsPrewarmService.hasPrewarmed, 'Should not have prewarmed yet')
mockMvm._emitEvent(IMVM.Events.stateChange, MatlabMVMConnectionState.CONNECTED)
// Wait for async operations to resolve
await new Promise(resolve => setTimeout(resolve, 0))
sinon.assert.calledOnce(mockMvm.feval)
sinon.assert.calledWith(mockMvm.feval, 'matlab.desktop.internal.webdesktop', 0, ['-hidden']);
assert.ok(graphicsPrewarmService.hasPrewarmed, 'Should have prewarmed after MVM READY event')
})
it('should prewarm on settings change', async () => {
mockConfigurationManager.getConfiguration.resolves({ prewarmGraphics: false })
mockMvm.getMatlabRelease.returns('R2025a')
const graphicsPrewarmService = new GraphicsPrewarmService(mockMvm, mockConfigurationManager)
assert.ok(!graphicsPrewarmService.hasPrewarmed, 'Should not have prewarmed yet')
mockMvm._emitEvent(IMVM.Events.stateChange, MatlabMVMConnectionState.CONNECTED)
sinon.assert.notCalled(mockMvm.feval)
assert.ok(!graphicsPrewarmService.hasPrewarmed, 'Still should not have prewarmed because setting is disabled')
mockConfigurationManager._triggerSettingCallback('prewarmGraphics', { prewarmGraphics: true })
// Wait for async operations to resolve
await new Promise(resolve => setTimeout(resolve, 0))
sinon.assert.calledOnce(mockMvm.feval)
sinon.assert.calledWith(mockMvm.feval, 'matlab.desktop.internal.webdesktop', 0, ['-hidden'])
assert.ok(graphicsPrewarmService.hasPrewarmed, 'Should have prewarmed after settings change')
})
it('should not prewarm with invalid MATLAB release', async () => {
mockConfigurationManager.getConfiguration.resolves({ prewarmGraphics: true })
mockMvm.getMatlabRelease.returns(null)
const graphicsPrewarmService = new GraphicsPrewarmService(mockMvm, mockConfigurationManager)
assert.ok(!graphicsPrewarmService.hasPrewarmed, 'Should not have prewarmed yet')
mockMvm._emitEvent(IMVM.Events.stateChange, MatlabMVMConnectionState.CONNECTED)
// Wait for async operations to resolve
await new Promise(resolve => setTimeout(resolve, 0))
sinon.assert.notCalled(mockMvm.feval)
assert.ok(!graphicsPrewarmService.hasPrewarmed, 'Still should not have prewarmed because of invalid MATLAB release')
})
it('should not feval with older MATLAB release', async () => {
mockConfigurationManager.getConfiguration.resolves({ prewarmGraphics: true })
mockMvm.getMatlabRelease.returns('R2023a') // An older release than R2025a
const graphicsPrewarmService = new GraphicsPrewarmService(mockMvm, mockConfigurationManager)
assert.ok(!graphicsPrewarmService.hasPrewarmed, 'Should not have prewarmed yet')
mockMvm._emitEvent(IMVM.Events.stateChange, MatlabMVMConnectionState.CONNECTED)
// Wait for async operations to resolve
await new Promise(resolve => setTimeout(resolve, 0))
sinon.assert.notCalled(mockMvm.feval)
assert.ok(graphicsPrewarmService.hasPrewarmed, 'Should be marked as prewarmed with older MATLAB release')
})
it('should not prewarm if already prewarmed', async () => {
mockConfigurationManager.getConfiguration.resolves({ prewarmGraphics: true })
mockMvm.getMatlabRelease.returns('R2025a')
const graphicsPrewarmService = new GraphicsPrewarmService(mockMvm, mockConfigurationManager)
graphicsPrewarmService.hasPrewarmed = true // Manually set prewarmed status
mockMvm._emitEvent(IMVM.Events.stateChange, MatlabMVMConnectionState.CONNECTED)
// Wait for async operations to resolve
await new Promise(resolve => setTimeout(resolve, 0))
sinon.assert.notCalled(mockMvm.feval)
assert.ok(graphicsPrewarmService.hasPrewarmed, 'Should remain prewarmed and not re-prewarm')
})
it('should reset prewarmed status when MATLAB disconnected', async () => {
mockConfigurationManager.getConfiguration.resolves({ prewarmGraphics: true })
mockMvm.getMatlabRelease.returns('R2025a')
const graphicsPrewarmService = new GraphicsPrewarmService(mockMvm, mockConfigurationManager)
graphicsPrewarmService.hasPrewarmed = true // Manually set prewarmed status
mockMvm._emitEvent(IMVM.Events.stateChange, MatlabMVMConnectionState.DISCONNECTED)
// Wait for async operations to resolve
await new Promise(resolve => setTimeout(resolve, 0))
assert.ok(!graphicsPrewarmService.hasPrewarmed, 'Should reset prewarmed status when MATLAB disconnects')
})
})