icon-services-spec.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /* eslint-env jasmine */
  2. /* global waitsForPromise */
  3. const path = require('path')
  4. const {Disposable} = require('atom')
  5. const DefaultFileIcons = require('../lib/default-file-icons')
  6. const getIconServices = require('../lib/get-icon-services')
  7. describe('icon services', () => {
  8. let iconServices, tab
  9. beforeEach(() => {
  10. iconServices = getIconServices()
  11. waitsForPromise(() => atom.workspace.open(path.join(__dirname, 'fixtures', 'sample.js')))
  12. waitsForPromise(() => atom.packages.activatePackage('tabs'))
  13. runs(() => {
  14. tab = atom.workspace.getElement().querySelector('.tab')
  15. expect(tab.itemTitle.className).toBe('title')
  16. })
  17. })
  18. afterEach(() => {
  19. iconServices.resetElementIcons()
  20. iconServices.resetFileIcons()
  21. })
  22. describe('atom.file-icons', () => {
  23. it('has a default handler', () => {
  24. expect(iconServices.fileIcons).toBe(DefaultFileIcons)
  25. })
  26. it('shows no icons by default', () => {
  27. expect(DefaultFileIcons.iconClassForPath('foo.bar')).toEqual('')
  28. expect(DefaultFileIcons.iconClassForPath('README.md')).toEqual('')
  29. expect(DefaultFileIcons.iconClassForPath('foo.zip')).toEqual('')
  30. expect(DefaultFileIcons.iconClassForPath('foo.png')).toEqual('')
  31. expect(DefaultFileIcons.iconClassForPath('foo.pdf')).toEqual('')
  32. expect(DefaultFileIcons.iconClassForPath('foo.exe')).toEqual('')
  33. })
  34. it('allows a service to replace the default', () => {
  35. const provider = {iconClassForPath: () => 'foo bar'}
  36. const disposable = atom.packages.serviceHub.provide('atom.file-icons', '1.0.0', provider)
  37. expect(iconServices.fileIcons).toBe(provider)
  38. expect(tab.itemTitle.className).toBe('title icon foo bar')
  39. disposable.dispose()
  40. expect(iconServices.fileIcons).toBe(DefaultFileIcons)
  41. expect(tab.itemTitle.className).toBe('title')
  42. })
  43. it('accepts an array of strings as icon-classes', () => {
  44. const provider = {iconClassForPath: () => ['foo', 'bar']}
  45. const disposable = atom.packages.serviceHub.provide('atom.file-icons', '1.0.0', provider)
  46. expect(iconServices.fileIcons).toBe(provider)
  47. expect(tab.itemTitle.className).toBe('title icon foo bar')
  48. disposable.dispose()
  49. expect(iconServices.fileIcons).toBe(DefaultFileIcons)
  50. expect(tab.itemTitle.className).toBe('title')
  51. })
  52. })
  53. describe('file-icons.element-icons', () => {
  54. it('has no default handler', () => {
  55. expect(iconServices.elementIcons).toBe(null)
  56. })
  57. it('uses the element-icon service if available', () => {
  58. const provider = (element) => {
  59. element.classList.add('foo', 'bar')
  60. return new Disposable(() => {
  61. element.classList.remove('foo', 'bar', 'icon')
  62. })
  63. }
  64. const disposable = atom.packages.serviceHub.provide('file-icons.element-icons', '1.0.0', provider)
  65. expect(iconServices.elementIcons).toBe(provider)
  66. expect(tab.itemTitle.className).toBe('title icon foo bar')
  67. disposable.dispose()
  68. expect(iconServices.elementIcons).toBe(null)
  69. })
  70. })
  71. describe('when both services are provided', () => {
  72. it('gives priority to the element-icon service', () => {
  73. const basicProvider = {iconClassForPath: () => 'foo'}
  74. const elementProvider = (element) => {
  75. element.classList.add('bar')
  76. return new Disposable(() => {
  77. element.classList.remove('bar')
  78. })
  79. }
  80. atom.packages.serviceHub.provide('atom.file-icons', '1.0.0', basicProvider)
  81. atom.packages.serviceHub.provide('file-icons.element-icons', '1.0.0', elementProvider)
  82. expect(iconServices.fileIcons).toBe(basicProvider)
  83. expect(iconServices.elementIcons).toBe(elementProvider)
  84. expect(tab.itemTitle.className).toBe('title icon bar')
  85. })
  86. })
  87. })