"use strict";
/**
 * macOS特定的单元测试
 * 测试在macOS系统上的功能和行为
 */
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const test_base_1 = require("../utils/test-base");
const src_1 = require("../../src");
// 只在macOS系统上运行这些测试
describe('macOS System Tests', function () {
    before(function () {
        if (!test_base_1.PlatformUtils.isMacOS()) {
            this.skip();
        }
    });
    let osu;
    before(function () {
        // 使用新版本2.0 API
        osu = new src_1.OSUtils();
    });
    after(function () {
        // 清理资源，防止测试卡死
        if (osu) {
            osu.destroy();
        }
    });
    describe('macOS CPU Module', function () {
        describe('#info()', function () {
            it('应该返回正确的CPU信息', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.cpu.info();
                (0, chai_1.expect)(result.success).to.be.true;
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.exist;
                    (0, chai_1.expect)(result.data.model).to.be.a('string');
                    (0, chai_1.expect)(result.data.cores).to.be.a('number').and.greaterThan(0);
                    (0, chai_1.expect)(result.data.threads).to.be.a('number').and.greaterThan(0);
                }
            }));
        });
        describe('#usage()', function () {
            it('应该能够在macOS上获取CPU使用率', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.cpu.usage();
                if (!result.success) {
                    this.skip();
                }
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.be.a('number');
                    (0, chai_1.expect)(result.data).to.be.at.least(0);
                    (0, chai_1.expect)(result.data).to.be.at.most(100);
                }
            }));
        });
        describe('#loadAverage()', function () {
            it('应该返回macOS的负载平均值', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.cpu.loadAverage();
                (0, chai_1.expect)(result.success).to.be.true;
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.exist;
                    (0, chai_1.expect)(result.data.load1).to.be.a('number').and.at.least(0);
                    (0, chai_1.expect)(result.data.load5).to.be.a('number').and.at.least(0);
                    (0, chai_1.expect)(result.data.load15).to.be.a('number').and.at.least(0);
                }
            }));
        });
    });
    describe('macOS Memory Module', function () {
        describe('#info()', function () {
            it('应该能够获取内存信息', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.memory.info();
                (0, chai_1.expect)(result.success).to.be.true;
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.exist;
                    (0, chai_1.expect)(result.data.total).to.exist;
                    (0, chai_1.expect)(result.data.total.toBytes()).to.be.a('number').and.greaterThan(0);
                    (0, chai_1.expect)(result.data.available).to.exist;
                    (0, chai_1.expect)(result.data.used).to.exist;
                    (0, chai_1.expect)(result.data.usagePercentage).to.be.a('number').and.at.least(0).and.at.most(100);
                }
            }));
            it('内存信息应该与系统信息一致', (0, test_base_1.asyncTest)(async function () {
                const memResult = await osu.memory.info();
                const os = require('os');
                const totalMem = os.totalmem();
                if (!memResult.success) {
                    this.skip();
                }
                const tolerance = 0.1; // 允许10%的误差
                if (memResult.success) {
                    const expectedTotal = memResult.data.total.toBytes();
                    const ratio = Math.abs(totalMem - expectedTotal) / totalMem;
                    (0, chai_1.expect)(ratio).to.be.below(tolerance);
                }
            }));
        });
        describe('#usage()', function () {
            it('应该返回内存使用率', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.memory.usage();
                if (!result.success) {
                    this.skip();
                }
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.be.a('number');
                    (0, chai_1.expect)(result.data).to.be.at.least(0);
                    (0, chai_1.expect)(result.data).to.be.at.most(100);
                }
            }));
        });
    });
    describe('macOS Disk Module', function () {
        describe('#info()', function () {
            it('应该能够获取磁盘信息', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.disk.info();
                (0, chai_1.expect)(result.success).to.be.true;
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.be.an('array');
                    if (result.data.length > 0) {
                        const disk = result.data[0];
                        (0, chai_1.expect)(disk.filesystem).to.be.a('string');
                        (0, chai_1.expect)(disk.total).to.exist;
                        (0, chai_1.expect)(disk.used).to.exist;
                        (0, chai_1.expect)(disk.available).to.exist;
                        (0, chai_1.expect)(disk.usagePercentage).to.be.a('number').and.at.least(0).and.at.most(100);
                    }
                }
            }));
            it('应该支持macOS的多个卷', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.disk.info();
                (0, chai_1.expect)(result.success).to.be.true;
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.be.an('array');
                    // macOS 通常至少有根分区
                    (0, chai_1.expect)(result.data.length).to.be.at.least(1);
                    // 检查根分区
                    const rootPartition = result.data.find(d => d.mountpoint === '/');
                    (0, chai_1.expect)(rootPartition).to.exist;
                }
            }));
        });
        describe('#usage()', function () {
            it('磁盘空间信息应该与info()一致', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.disk.overallUsage();
                if (!result.success) {
                    this.skip();
                }
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.be.a('number');
                    (0, chai_1.expect)(result.data).to.be.at.least(0);
                    (0, chai_1.expect)(result.data).to.be.at.most(100);
                }
            }));
        });
    });
    describe('macOS Network Module', function () {
        describe('#interfaces()', function () {
            it('应该能够获取macOS网络接口统计', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.network.interfaces();
                (0, chai_1.expect)(result.success).to.be.true;
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.be.an('array');
                    if (result.data.length > 0) {
                        const iface = result.data[0];
                        (0, chai_1.expect)(iface.name).to.be.a('string');
                        (0, chai_1.expect)(iface.addresses).to.exist;
                        (0, chai_1.expect)(iface.mac).to.be.a('string');
                    }
                }
            }));
            it('网络统计应该包含macOS典型接口', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.network.interfaces();
                if (!result.success || result.data.length === 0) {
                    this.skip();
                }
                if (result.success) {
                    const interfaceNames = result.data.map(i => i.name);
                    // 应该至少包含本地回环接口
                    (0, chai_1.expect)(interfaceNames.some(name => name === 'lo0')).to.be.true;
                }
            }));
        });
        describe('#overview()', function () {
            it('应该能够计算macOS的网络流量', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.network.overview();
                if (!result.success) {
                    this.skip();
                }
                if (result.success) {
                    (0, chai_1.expect)(result.data).to.exist;
                    (0, chai_1.expect)(result.data.totalRxBytes).to.exist;
                    (0, chai_1.expect)(result.data.totalTxBytes).to.exist;
                }
            }));
            it('网络流量计算应该准确', (0, test_base_1.asyncTest)(async function () {
                const result = await osu.network.overview();
                if (!result.success) {
                    this.skip();
                }
                if (result.success) {
                    (0, chai_1.expect)(result.data.totalRxBytes.toBytes()).to.be.a('number').and.at.least(0);
                    (0, chai_1.expect)(result.data.totalTxBytes.toBytes()).to.be.a('number').and.at.least(0);
                }
            }));
        });
    });
    describe('macOS System Commands', function () {
        it('应该能够访问macOS特有的系统命令', (0, test_base_1.asyncTest)(async function () {
            const result = await osu.system.info();
            (0, chai_1.expect)(result.success).to.be.true;
            if (result.success) {
                (0, chai_1.expect)(result.data).to.exist;
                (0, chai_1.expect)(result.data.platform).to.equal('darwin');
            }
        }));
        it('应该能够执行system_profiler获取硬件信息', (0, test_base_1.asyncTest)(async function () {
            const result = await osu.system.info();
            (0, chai_1.expect)(result.success).to.be.true;
            if (result.success) {
                (0, chai_1.expect)(result.data.hostname).to.be.a('string');
                (0, chai_1.expect)(result.data.release).to.be.a('string');
            }
        }));
    });
    describe('macOS Performance Tests', function () {
        it('macOS系统调用应该高效执行', (0, test_base_1.longTest)(async function () {
            const monitor = new test_base_1.PerformanceMonitor();
            const start1 = Date.now();
            await osu.cpu.info();
            const cpu_time = Date.now() - start1;
            const start2 = Date.now();
            await osu.memory.info();
            const memory_time = Date.now() - start2;
            const start3 = Date.now();
            await osu.disk.info();
            const disk_time = Date.now() - start3;
            // macOS 系统调用应该在合理时间内完成
            (0, chai_1.expect)(cpu_time).to.be.below(1000, 'CPU info should complete within 1s');
            (0, chai_1.expect)(memory_time).to.be.below(1000, 'Memory info should complete within 1s');
            (0, chai_1.expect)(disk_time).to.be.below(2000, 'Disk info should complete within 2s');
        }));
        it('Apple Silicon Mac应该有更好的性能', (0, test_base_1.longTest)(async function () {
            const result = await osu.cpu.info();
            if (!result.success) {
                this.skip();
            }
            // 在 Apple Silicon Mac 上，某些操作可能更快
            if (result.success && result.data.model.includes('Apple')) {
                const start = Date.now();
                await osu.cpu.usage();
                const time = Date.now() - start;
                (0, chai_1.expect)(time).to.be.below(500, 'Apple Silicon should have faster CPU usage calls');
            }
        }));
    });
    describe('macOS Error Handling', function () {
        it('应该正确处理macOS特有的权限问题', (0, test_base_1.asyncTest)(async function () {
            // 测试权限受限的操作
            const result = await osu.process.list();
            // 如果没有权限，应该优雅地处理
            if (!result.success) {
                (0, chai_1.expect)(result.error).to.exist;
                (0, chai_1.expect)(result.error.code).to.be.oneOf(['PERMISSION_DENIED', 'NOT_SUPPORTED']);
            }
        }));
        it('应该处理不同版本的macOS', (0, test_base_1.asyncTest)(async function () {
            const result = await osu.system.info();
            (0, chai_1.expect)(result.success).to.be.true;
            if (result.success) {
                (0, chai_1.expect)(result.data.release).to.be.a('string');
                // 应该能够解析版本号
                const version = result.data.release;
                (0, chai_1.expect)(version).to.match(/\d+\.\d+/);
            }
        }));
    });
});
//# sourceMappingURL=macos.test.js.map