/* * Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3.0 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * version 3.0 for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" #include <string.h> #import "ObjFW.h" #import "ObjFWTest.h" @interface OFValueTests: OTTestCase @end @implementation OFValueTests - (void)testObjCType { OFRange range = OFMakeRange(1, 64); OFValue *value = [OFValue valueWithBytes: &range objCType: @encode(OFRange)]; OTAssertEqual(strcmp(value.objCType, @encode(OFRange)), 0); } - (void)testGetValueSize { OFRange range = OFMakeRange(1, 64), range2; OFValue *value = [OFValue valueWithBytes: &range objCType: @encode(OFRange)]; [value getValue: &range2 size: sizeof(OFRange)]; OTAssert(OFEqualRanges(range2, range)); } - (void)testGetValueSizeThrowsOnWrongSize { OFRange range = OFMakeRange(1, 64); OFValue *value = [OFValue valueWithBytes: &range objCType: @encode(OFRange)]; OTAssertThrowsSpecific( [value getValue: &range size: sizeof(OFRange) - 1], OFOutOfRangeException); } - (void)testPointer { void *pointer = &pointer; OFValue *value = [OFValue valueWithPointer: pointer]; OTAssertEqual(value.pointerValue, pointer); OTAssertEqual([[OFValue valueWithBytes: &pointer objCType: @encode(void *)] pointerValue], pointer); OTAssertThrowsSpecific( [[OFValue valueWithBytes: "a" objCType: @encode(char)] pointerValue], OFOutOfRangeException); } - (void)testNonretainedObject { id object = (id)&object; OFValue *value = [OFValue valueWithNonretainedObject: object]; OTAssertEqual(value.nonretainedObjectValue, object); OTAssertEqual([[OFValue valueWithBytes: &object objCType: @encode(id)] nonretainedObjectValue], object); OTAssertThrowsSpecific( [[OFValue valueWithBytes: "a" objCType: @encode(char)] nonretainedObjectValue], OFOutOfRangeException); } - (void)testRange { OFRange range = OFMakeRange(1, 64), range2; OFValue *value = [OFValue valueWithRange: range]; OTAssert(OFEqualRanges(value.rangeValue, range)); OTAssert(OFEqualRanges( [[OFValue valueWithBytes: &range objCType: @encode(OFRange)] rangeValue], range)); [value getValue: &range2 size: sizeof(range2)]; OTAssert(OFEqualRanges(range2, range)); OTAssertThrowsSpecific( [[OFValue valueWithBytes: "a" objCType: @encode(char)] rangeValue], OFOutOfRangeException); } - (void)testPoint { OFPoint point = OFMakePoint(1.5f, 3.0f), point2; OFValue *value = [OFValue valueWithPoint: point]; OTAssert(OFEqualPoints(value.pointValue, point)); OTAssert(OFEqualPoints( [[OFValue valueWithBytes: &point objCType: @encode(OFPoint)] pointValue], point)); [value getValue: &point2 size: sizeof(point2)]; OTAssert(OFEqualPoints(point2, point)); OTAssertThrowsSpecific( [[OFValue valueWithBytes: "a" objCType: @encode(char)] pointValue], OFOutOfRangeException); } - (void)testSize { OFSize size = OFMakeSize(4.5f, 5.0f), size2; OFValue *value = [OFValue valueWithSize: size]; OTAssert(OFEqualSizes(value.sizeValue, size)); OTAssert(OFEqualSizes( [[OFValue valueWithBytes: &size objCType: @encode(OFSize)] sizeValue], size)); [value getValue: &size2 size: sizeof(size2)]; OTAssert(OFEqualSizes(size2, size)); OTAssertThrowsSpecific( [[OFValue valueWithBytes: "a" objCType: @encode(char)] sizeValue], OFOutOfRangeException); } - (void)testRect { OFRect rect = OFMakeRect(1.5f, 3.0f, 4.5f, 6.0f), rect2; OFValue *value = [OFValue valueWithRect: rect]; OTAssert(OFEqualRects(value.rectValue, rect)); OTAssert(OFEqualRects( [[OFValue valueWithBytes: &rect objCType: @encode(OFRect)] rectValue], rect)); [value getValue: &rect2 size: sizeof(rect2)]; OTAssert(OFEqualRects(rect2, rect)); OTAssertThrowsSpecific( [[OFValue valueWithBytes: "a" objCType: @encode(char)] rectValue], OFOutOfRangeException); } - (void)testIsEqual { OFRect rect = OFMakeRect(1.5f, 3.0f, 4.5f, 6.0f); OTAssertEqualObjects([OFValue valueWithRect: rect], [OFValue valueWithBytes: &rect objCType: @encode(OFRect)]); OTAssertNotEqualObjects( [OFValue valueWithBytes: "a" objCType: @encode(signed char)], [OFValue valueWithBytes: "a" objCType: @encode(unsigned char)]); OTAssertNotEqualObjects( [OFValue valueWithBytes: "a" objCType: @encode(char)], [OFValue valueWithBytes: "b" objCType: @encode(char)]); } @end