Skip to content

Commit

Permalink
feat: Use config data to build profile menu (#4)
Browse files Browse the repository at this point in the history
BREAKING CHANGE:

- Use config data to build profiles and profile menu
  - no more adding new config settings in multiple places
- add Project Cwd setting
- add enable addon settings
- disable webgl by default since it is not stable
  • Loading branch information
UziTech authored Feb 24, 2020
2 parents 09c8b4a + 8d6abe7 commit c5c55e3
Show file tree
Hide file tree
Showing 17 changed files with 1,068 additions and 1,021 deletions.
2 changes: 1 addition & 1 deletion dist/lib/x-terminal.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/lib/x-terminal.js.map

Large diffs are not rendered by default.

188 changes: 94 additions & 94 deletions spec/config-spec.js

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions spec/custom-runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,14 @@ prunk.suppress(/\.(?:sa|s?c)ss$/)

module.exports = createRunner({
reporter: new SpecReporter(),
}, () => {
const warn = console.warn.bind(console)
beforeEach(() => {
spyOn(console, 'warn').and.callFake((...args) => {
if (args[0].includes('not attached to the DOM')) {
return
}
warn(...args)
})
})
})
82 changes: 71 additions & 11 deletions spec/element-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ temp.track()
describe('XTerminalElement', () => {
const savedPlatform = process.platform
this.element = null
this.tmpdirObj = null
this.tmpdir = null

const createNewElement = async (uri = 'x-terminal://somesessionid/') => {
const terminalsSet = new Set()
Expand Down Expand Up @@ -100,7 +100,7 @@ describe('XTerminalElement', () => {
})

it('getShellCommand()', () => {
expect(this.element.getShellCommand()).toBe(configDefaults.getDefaultShellCommand())
expect(this.element.getShellCommand()).toBe(configDefaults.command)
})

it('getShellCommand() command set in uri', async () => {
Expand Down Expand Up @@ -129,7 +129,7 @@ describe('XTerminalElement', () => {
})

it('getTermType()', () => {
expect(this.element.getTermType()).toBe(configDefaults.getDefaultTermType())
expect(this.element.getTermType()).toBe(configDefaults.termType)
})

it('getTermType() name set in uri', async () => {
Expand Down Expand Up @@ -167,7 +167,7 @@ describe('XTerminalElement', () => {

it('getCwd()', async () => {
const cwd = await this.element.getCwd()
expect(cwd).toBe(configDefaults.getDefaultCwd())
expect(cwd).toBe(configDefaults.cwd)
})

it('getCwd() cwd set in uri', async () => {
Expand All @@ -179,6 +179,16 @@ describe('XTerminalElement', () => {
expect(cwd).toBe(expected)
})

it('getCwd() ignore cwd in uri if projectCwd is set', async () => {
const expected = await temp.mkdir('projectCwd')
spyOn(atom.project, 'getPaths').and.returnValue([expected])
const params = new URLSearchParams({ projectCwd: true, cwd: this.tmpdir })
const url = new URL('x-terminal://?' + params.toString())
const element = await createNewElement(url.href)
const cwd = await element.getCwd()
expect(cwd).toBe(expected)
})

it('getCwd() model getPath() returns valid path', async () => {
const previousActiveItem = jasmine.createSpyObj(
'previousActiveItem',
Expand All @@ -204,7 +214,7 @@ describe('XTerminalElement', () => {
)
const element = await createNewElement()
const cwd = await element.getCwd()
expect(cwd).toBe(configDefaults.getDefaultCwd())
expect(cwd).toBe(configDefaults.cwd)
})

it('getCwd() non-existent cwd set in uri', async () => {
Expand All @@ -213,14 +223,14 @@ describe('XTerminalElement', () => {
const url = new URL('x-terminal://?' + params.toString())
await createNewElement(url.href)
const cwd = await this.element.getCwd()
expect(cwd).toBe(configDefaults.getDefaultCwd())
expect(cwd).toBe(configDefaults.cwd)
})

it('getCwd() non-existent project path added', async () => {
spyOn(atom.project, 'getPaths').and.returnValue([path.join(this.tmpdir, 'non-existent-dir')])
const element = await createNewElement()
const cwd = await element.getCwd()
expect(cwd).toBe(configDefaults.getDefaultCwd())
expect(cwd).toBe(configDefaults.cwd)
})

it('getEnv()', () => {
Expand Down Expand Up @@ -1054,6 +1064,56 @@ describe('XTerminalElement', () => {
expect(this.element.ptyProcess).toBeTruthy()
})

describe('loaded addons', () => {
const { Terminal } = require('xterm')
const { WebLinksAddon } = require('xterm-addon-web-links')
const { WebglAddon } = require('xterm-addon-webgl')

beforeEach(() => {
spyOn(Terminal.prototype, 'loadAddon').and.callThrough()
})

it('createTerminal() enable web-link addon', async () => {
const params = new URLSearchParams({ webLinks: true })
const url = new URL('x-terminal://?' + params.toString())
await createNewElement(url.href)
const wasAdded = Terminal.prototype.loadAddon.calls.all().some(call => {
return call.args[0] instanceof WebLinksAddon
})
expect(wasAdded).toBe(true)
})

it('createTerminal() disable web-link addon', async () => {
const params = new URLSearchParams({ webLinks: false })
const url = new URL('x-terminal://?' + params.toString())
await createNewElement(url.href)
const wasAdded = Terminal.prototype.loadAddon.calls.all().some(call => {
return call.args[0] instanceof WebLinksAddon
})
expect(wasAdded).toBe(false)
})

it('createTerminal() enable webgl addon', async () => {
const params = new URLSearchParams({ webgl: true })
const url = new URL('x-terminal://?' + params.toString())
await createNewElement(url.href)
const wasAdded = Terminal.prototype.loadAddon.calls.all().some(call => {
return call.args[0] instanceof WebglAddon
})
expect(wasAdded).toBe(true)
})

it('createTerminal() disable webgl addon', async () => {
const params = new URLSearchParams({ webgl: false })
const url = new URL('x-terminal://?' + params.toString())
await createNewElement(url.href)
const wasAdded = Terminal.prototype.loadAddon.calls.all().some(call => {
return call.args[0] instanceof WebglAddon
})
expect(wasAdded).toBe(false)
})
})

it('restartPtyProcess() check new pty process created', async () => {
const oldPtyProcess = this.element.ptyProcess
const newPtyProcess = jasmine.createSpyObj('ptyProcess',
Expand Down Expand Up @@ -1820,23 +1880,23 @@ describe('XTerminalElement', () => {
})

it('use ctrl+wheelScrollUp font already at maximum', () => {
this.element.model.profile.fontSize = configDefaults.getMaximumFontSize()
this.element.model.profile.fontSize = configDefaults.maximumFontSize
const wheelEvent = new WheelEvent('wheel', {
deltaY: -150,
ctrlKey: true,
})
this.element.terminalDiv.dispatchEvent(wheelEvent)
expect(this.element.model.profile.fontSize).toBe(configDefaults.getMaximumFontSize())
expect(this.element.model.profile.fontSize).toBe(configDefaults.maximumFontSize)
})

it('use ctrl+wheelScrollDown font already at minimum', () => {
this.element.model.profile.fontSize = configDefaults.getMinimumFontSize()
this.element.model.profile.fontSize = configDefaults.minimumFontSize
const wheelEvent = new WheelEvent('wheel', {
deltaY: 150,
ctrlKey: true,
})
this.element.terminalDiv.dispatchEvent(wheelEvent)
expect(this.element.model.profile.fontSize).toBe(configDefaults.getMinimumFontSize())
expect(this.element.model.profile.fontSize).toBe(configDefaults.minimumFontSize)
})

it('getXtermOptions() default options', () => {
Expand Down
23 changes: 19 additions & 4 deletions spec/model-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ describe('XTerminalModel', () => {
terminals_set: new Set(),
})
await model.initializedPromise
expect(model.getPath()).toBe(configDefaults.getDefaultCwd())
expect(model.getPath()).toBe(configDefaults.cwd)
})

it('constructor with valid cwd passed in uri', async () => {
Expand All @@ -83,6 +83,21 @@ describe('XTerminalModel', () => {
expect(model.getPath()).toBe(this.tmpdir)
})

it('use projectCwd with valid cwd passed in uri', async () => {
const expected = await temp.mkdir('projectCwd')
spyOn(atom.project, 'getPaths').and.returnValue([expected])
spyOn(atom.workspace, 'getActivePaneItem').and.returnValue({})
const url = XTerminalProfilesSingleton.instance.generateNewUrlFromProfileData({})
url.searchParams.set('projectCwd', true)
url.searchParams.set('cwd', this.tmpdir)
const model = new XTerminalModel({
uri: url.href,
terminals_set: new Set(),
})
await model.initializedPromise
expect(model.getPath()).toBe(expected)
})

it('constructor with invalid cwd passed in uri', async () => {
spyOn(atom.workspace, 'getActivePaneItem').and.returnValue({})
const url = XTerminalProfilesSingleton.instance.generateNewUrlFromProfileData({})
Expand All @@ -92,7 +107,7 @@ describe('XTerminalModel', () => {
terminals_set: new Set(),
})
await model.initializedPromise
expect(model.getPath()).toBe(configDefaults.getDefaultCwd())
expect(model.getPath()).toBe(configDefaults.cwd)
})

it('constructor with previous active item that has getPath() method', async () => {
Expand Down Expand Up @@ -130,7 +145,7 @@ describe('XTerminalModel', () => {
terminals_set: new Set(),
})
await model.initializedPromise
expect(model.getPath()).toBe(configDefaults.getDefaultCwd())
expect(model.getPath()).toBe(configDefaults.cwd)
})

it('constructor with previous active item which exists in project path', async () => {
Expand Down Expand Up @@ -277,7 +292,7 @@ describe('XTerminalModel', () => {
})

it('getPath()', () => {
expect(this.model.getPath()).toBe(configDefaults.getDefaultCwd())
expect(this.model.getPath()).toBe(configDefaults.cwd)
})

it('getPath() cwd set', () => {
Expand Down
47 changes: 0 additions & 47 deletions spec/profile-menu-element-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,45 +82,6 @@ describe('XTerminalProfileMenuElement', () => {
expect(this.element.getModelProfile()).toBe(mock)
})

it('parseJson() array type', () => {
const expected = ['foo']
const actual = this.element.parseJson(
'["foo"]',
null,
Array,
)
expect(actual).toEqual(expected)
})

it('parseJson() object type', () => {
const expected = { foo: 'bar' }
const actual = this.element.parseJson(
'{"foo": "bar"}',
null,
Object,
)
expect(actual).toEqual(expected)
})

it('parseJson() default value', () => {
const expected = ['foo']
const actual = this.element.parseJson(
'null',
expected,
Array,
)
expect(actual).toEqual(expected)
})

it('parseJson() syntax error', () => {
const actual = this.element.parseJson(
'[[',
'foo',
Array,
)
expect(actual).toBe('foo')
})

it('getMenuElements()', () => {
expect(this.element.getMenuElements()).toBeTruthy()
})
Expand Down Expand Up @@ -324,14 +285,6 @@ describe('XTerminalProfileMenuElement', () => {
this.element.promptForNewProfileName('foo', 'bar')
})

it('convertNullToEmptyString() value is null', () => {
expect(this.element.convertNullToEmptyString(null)).toBe('')
})

it('convertNullToEmptyString() value is not null', () => {
expect(this.element.convertNullToEmptyString('foo')).toBe('"foo"')
})

it('setNewMenuSettings()', () => {
this.element.setNewMenuSettings(this.element.profilesSingleton.getBaseProfile())
})
Expand Down
Loading

0 comments on commit c5c55e3

Please sign in to comment.