// Copyright 2026 twonly contributors. BSD-style license; see LICENSE. import AVFoundation import XCTest @testable import camera_avfoundation final class CameraImageStreamScalerTests: XCTestCase { func testReducesBGRAFrameWithoutChangingPreviewBuffer() throws { var pixelBuffer: CVPixelBuffer? XCTAssertEqual( CVPixelBufferCreate( kCFAllocatorDefault, 1920, 1080, kCVPixelFormatType_32BGRA, nil, &pixelBuffer), kCVReturnSuccess) let buffer = try XCTUnwrap(pixelBuffer) CVPixelBufferLockBaseAddress(buffer, []) defer { CVPixelBufferUnlockBaseAddress(buffer, []) } let address = try XCTUnwrap(CVPixelBufferGetBaseAddress(buffer)) memset(address, 127, CVPixelBufferGetBytesPerRow(buffer) * 1080) let plane = try XCTUnwrap(CameraImageStreamScaler.scaleBGRA(buffer, maximumDimension: 640)) XCTAssertEqual(plane.width, 640) XCTAssertEqual(plane.height, 360) XCTAssertEqual(plane.bytesPerRow, 2560) XCTAssertEqual(plane.bytes.data.count, 640 * 360 * 4) XCTAssertEqual(plane.bytes.data.first, 127) XCTAssertEqual(CVPixelBufferGetWidth(buffer), 1920) XCTAssertEqual(CVPixelBufferGetHeight(buffer), 1080) XCTAssertEqual(address.load(as: UInt8.self), 127) } func testDoesNotUpscaleSmallFrames() throws { var pixelBuffer: CVPixelBuffer? XCTAssertEqual( CVPixelBufferCreate( kCFAllocatorDefault, 320, 240, kCVPixelFormatType_32BGRA, nil, &pixelBuffer), kCVReturnSuccess) let buffer = try XCTUnwrap(pixelBuffer) CVPixelBufferLockBaseAddress(buffer, []) defer { CVPixelBufferUnlockBaseAddress(buffer, []) } XCTAssertNil(CameraImageStreamScaler.scaleBGRA(buffer, maximumDimension: 640)) } }