mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-03 06:47:33 +00:00
271 lines
9.1 KiB
TypeScript
271 lines
9.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import type {
|
|
RegistryAccelerator,
|
|
RegistryOS
|
|
} from '@/workbench/extensions/manager/types/compatibility.types'
|
|
import {
|
|
checkAcceleratorCompatibility,
|
|
checkOSCompatibility,
|
|
normalizeOSList
|
|
} from '@/workbench/extensions/manager/utils/systemCompatibility'
|
|
|
|
describe('systemCompatibility', () => {
|
|
describe('checkOSCompatibility', () => {
|
|
it('should return null when supported OS list is null', () => {
|
|
const result = checkOSCompatibility(null, 'darwin')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when supported OS list is undefined', () => {
|
|
const result = checkOSCompatibility(undefined, 'darwin')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when supported OS list is empty', () => {
|
|
const result = checkOSCompatibility([], 'darwin')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when OS is compatible (macOS)', () => {
|
|
const supported: RegistryOS[] = ['macOS', 'Windows']
|
|
const result = checkOSCompatibility(supported, 'darwin')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when OS is compatible (Windows)', () => {
|
|
const supported: RegistryOS[] = ['Windows', 'Linux']
|
|
const result = checkOSCompatibility(supported, 'win32')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when OS is compatible (Linux)', () => {
|
|
const supported: RegistryOS[] = ['Linux', 'macOS']
|
|
const result = checkOSCompatibility(supported, 'linux')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return conflict when OS is incompatible', () => {
|
|
const supported: RegistryOS[] = ['Windows']
|
|
const result = checkOSCompatibility(supported, 'darwin')
|
|
expect(result).toEqual({
|
|
type: 'os',
|
|
current_value: 'macOS',
|
|
required_value: 'Windows'
|
|
})
|
|
})
|
|
|
|
it('should return conflict with Unknown OS when current OS is unrecognized', () => {
|
|
const supported: RegistryOS[] = ['Windows', 'Linux']
|
|
const result = checkOSCompatibility(supported, 'freebsd')
|
|
expect(result).toEqual({
|
|
type: 'os',
|
|
current_value: 'Unknown',
|
|
required_value: 'Windows, Linux'
|
|
})
|
|
})
|
|
|
|
it('should handle various OS string formats', () => {
|
|
const supported: RegistryOS[] = ['Windows']
|
|
|
|
// Test Windows variations
|
|
expect(checkOSCompatibility(supported, 'win32')).toBeNull()
|
|
expect(checkOSCompatibility(supported, 'windows')).toBeNull()
|
|
expect(checkOSCompatibility(supported, 'Windows_NT')).toBeNull()
|
|
|
|
// Test macOS variations
|
|
const macSupported: RegistryOS[] = ['macOS']
|
|
expect(checkOSCompatibility(macSupported, 'darwin')).toBeNull()
|
|
expect(checkOSCompatibility(macSupported, 'Darwin')).toBeNull()
|
|
expect(checkOSCompatibility(macSupported, 'macos')).toBeNull()
|
|
expect(checkOSCompatibility(macSupported, 'mac')).toBeNull()
|
|
})
|
|
|
|
it('should handle undefined current OS', () => {
|
|
const supported: RegistryOS[] = ['Windows']
|
|
const result = checkOSCompatibility(supported, undefined)
|
|
expect(result).toEqual({
|
|
type: 'os',
|
|
current_value: 'Unknown',
|
|
required_value: 'Windows'
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('checkAcceleratorCompatibility', () => {
|
|
it('should return null when supported accelerator list is null', () => {
|
|
const result = checkAcceleratorCompatibility(null, 'cuda')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when supported accelerator list is undefined', () => {
|
|
const result = checkAcceleratorCompatibility(undefined, 'cuda')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when supported accelerator list is empty', () => {
|
|
const result = checkAcceleratorCompatibility([], 'cuda')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when accelerator is compatible (CUDA)', () => {
|
|
const supported: RegistryAccelerator[] = ['CUDA', 'CPU']
|
|
const result = checkAcceleratorCompatibility(supported, 'cuda')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when accelerator is compatible (Metal)', () => {
|
|
const supported: RegistryAccelerator[] = ['Metal', 'CPU']
|
|
const result = checkAcceleratorCompatibility(supported, 'mps')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when accelerator is compatible (ROCm)', () => {
|
|
const supported: RegistryAccelerator[] = ['ROCm', 'CPU']
|
|
const result = checkAcceleratorCompatibility(supported, 'rocm')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null when accelerator is compatible (CPU)', () => {
|
|
const supported: RegistryAccelerator[] = ['CPU']
|
|
const result = checkAcceleratorCompatibility(supported, 'cpu')
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return conflict when accelerator is incompatible', () => {
|
|
const supported: RegistryAccelerator[] = ['CUDA']
|
|
const result = checkAcceleratorCompatibility(supported, 'mps')
|
|
expect(result).toEqual({
|
|
type: 'accelerator',
|
|
current_value: 'Metal',
|
|
required_value: 'CUDA'
|
|
})
|
|
})
|
|
|
|
it('should default to CPU for unknown device types', () => {
|
|
const supported: RegistryAccelerator[] = ['CUDA']
|
|
const result = checkAcceleratorCompatibility(supported, 'unknown')
|
|
expect(result).toEqual({
|
|
type: 'accelerator',
|
|
current_value: 'CPU',
|
|
required_value: 'CUDA'
|
|
})
|
|
})
|
|
|
|
it('should default to CPU when device type is undefined', () => {
|
|
const supported: RegistryAccelerator[] = ['CUDA']
|
|
const result = checkAcceleratorCompatibility(supported, undefined)
|
|
expect(result).toEqual({
|
|
type: 'accelerator',
|
|
current_value: 'CPU',
|
|
required_value: 'CUDA'
|
|
})
|
|
})
|
|
|
|
it('should handle case-insensitive device types', () => {
|
|
const supported: RegistryAccelerator[] = ['CUDA']
|
|
|
|
// CUDA variations
|
|
expect(checkAcceleratorCompatibility(supported, 'cuda')).toBeNull()
|
|
expect(checkAcceleratorCompatibility(supported, 'CUDA')).toBeNull()
|
|
expect(checkAcceleratorCompatibility(supported, 'Cuda')).toBeNull()
|
|
|
|
// Metal variations
|
|
const metalSupported: RegistryAccelerator[] = ['Metal']
|
|
expect(checkAcceleratorCompatibility(metalSupported, 'mps')).toBeNull()
|
|
expect(checkAcceleratorCompatibility(metalSupported, 'MPS')).toBeNull()
|
|
|
|
// ROCm variations
|
|
const rocmSupported: RegistryAccelerator[] = ['ROCm']
|
|
expect(checkAcceleratorCompatibility(rocmSupported, 'rocm')).toBeNull()
|
|
expect(checkAcceleratorCompatibility(rocmSupported, 'ROCM')).toBeNull()
|
|
})
|
|
|
|
it('should handle multiple required accelerators', () => {
|
|
const supported: RegistryAccelerator[] = ['CUDA', 'ROCm']
|
|
const result = checkAcceleratorCompatibility(supported, 'mps')
|
|
expect(result).toEqual({
|
|
type: 'accelerator',
|
|
current_value: 'Metal',
|
|
required_value: 'CUDA, ROCm'
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('normalizeOSList', () => {
|
|
it('should return undefined for null input', () => {
|
|
const result = normalizeOSList(null)
|
|
expect(result).toBeUndefined()
|
|
})
|
|
|
|
it('should return undefined for undefined input', () => {
|
|
const result = normalizeOSList(undefined)
|
|
expect(result).toBeUndefined()
|
|
})
|
|
|
|
it('should return undefined for empty array', () => {
|
|
const result = normalizeOSList([])
|
|
expect(result).toBeUndefined()
|
|
})
|
|
|
|
it('should return undefined when OS Independent is present', () => {
|
|
const result = normalizeOSList(['OS Independent', 'Windows'])
|
|
expect(result).toBeUndefined()
|
|
})
|
|
|
|
it('should return undefined for case-insensitive OS Independent', () => {
|
|
const result = normalizeOSList(['os independent'])
|
|
expect(result).toBeUndefined()
|
|
})
|
|
|
|
it('should filter and return valid OS values', () => {
|
|
const result = normalizeOSList(['Windows', 'Linux', 'macOS'])
|
|
expect(result).toEqual(['Windows', 'Linux', 'macOS'])
|
|
})
|
|
|
|
it('should filter out invalid OS values', () => {
|
|
const result = normalizeOSList(['Windows', 'FreeBSD', 'Linux', 'Android'])
|
|
expect(result).toEqual(['Windows', 'Linux'])
|
|
})
|
|
|
|
it('should deduplicate OS values', () => {
|
|
const result = normalizeOSList([
|
|
'Windows',
|
|
'Linux',
|
|
'Windows',
|
|
'macOS',
|
|
'Linux'
|
|
])
|
|
expect(result).toEqual(['Windows', 'Linux', 'macOS'])
|
|
})
|
|
|
|
it('should return undefined when no valid OS values remain', () => {
|
|
const result = normalizeOSList(['FreeBSD', 'Android', 'iOS'])
|
|
expect(result).toBeUndefined()
|
|
})
|
|
|
|
it('should handle mixed valid and invalid values', () => {
|
|
const result = normalizeOSList([
|
|
'windows',
|
|
'Windows',
|
|
'linux',
|
|
'Linux',
|
|
'macos'
|
|
])
|
|
// Only exact matches are valid
|
|
expect(result).toEqual(['Windows', 'Linux'])
|
|
})
|
|
|
|
it('should preserve order of first occurrence when deduplicating', () => {
|
|
const result = normalizeOSList([
|
|
'Linux',
|
|
'Windows',
|
|
'macOS',
|
|
'Linux',
|
|
'Windows'
|
|
])
|
|
expect(result).toEqual(['Linux', 'Windows', 'macOS'])
|
|
})
|
|
})
|
|
})
|