public void TestBlock01()
{
IntPtr number;
int value;
int[] values = new int[256];
// Create random values
for (int i = 0; i < values.Length; i++)
{
values[i] = new Random().Next(1, 65535);
}
// Put zero at random index
values[new Random().Next(values.Length)] = 0;
// Create a mutable array
IntPtr array = objc_sendMsg_IntPtr(this.cls_NSMutableArray, this.sel_alloc);
Assert.AreNotEqual(IntPtr.Zero, array, "NSMutableArray allocation failed");
array = objc_sendMsg_IntPtr(array, this.sel_init);
Assert.AreNotEqual(IntPtr.Zero, array, "NSMutableArray initialization failed");
// Add elements
for (int i = 0; i < values.Length; i++)
{
number = objc_sendMsg_IntPtr_int(this.cls_NSNumber, this.sel_numberWithInt, values[i]);
Assert.AreNotEqual(IntPtr.Zero, number, "NSNumber '" + values[i] + "' initialization failed");
objc_sendMsg_void_IntPtr(array, this.sel_addObject, number);
}
// Checking the count
uint count;
if (ObjectiveCRuntime.Is64Bits)
{
count = (uint)objc_sendMsg_ulong(array, this.sel_count);
}
else
{
count = objc_sendMsg_uint(array, this.sel_count);
}
Assert.AreEqual(values.Length, count, "Array's count is wrong");
// Checking elements
for (int i = 0; i < values.Length; i++)
{
number = objc_sendMsg_IntPtr_uint(array, this.sel_objectAtIndex, (uint)i);
Assert.AreNotEqual(IntPtr.Zero, number, "Object at index " + i + " is nil");
value = objc_sendMsg_int(number, this.sel_intValue);
Assert.AreEqual(values[i], value, "Object at index " + i + " is wrong");
}
// int lastValue = 0;
// uint zeroIndex = 0;
//
// // Enumerate with a block: void (^)(id, NSUInteger, BOOL *)
// Action<IntPtr, TSUInteger, IntPtr> dlgt = delegate(IntPtr ptr1, TSUInteger ui1, IntPtr ptr2)
// {
// int v = objc_sendMsg_int(ptr1, this.sel_intValue);
// if (v == 0)
// {
// // Store the index of the zero value and stop enumeration
// zeroIndex = ui1;
// Marshal.WriteInt32(ptr2, 1);
// return;
// }
// // Store value if non-zero. On exit, contains the last non-zero value
// lastValue = v;
// };
// using (Block block1 = this.GetBlock(dlgt))
// {
// // Enumerate in forward order
// Assert.AreNotEqual(IntPtr.Zero, block1.NativePointer, "Block native structure is nil");
// objc_sendMsg_void_IntPtr(array, this.sel_enumerateObjectsUsingBlock, block1.NativePointer);
// int index = Array.FindIndex(values, (v) => (v == 0));
// Assert.AreEqual(index, zeroIndex, "Index of zero value is wrong");
// Assert.AreEqual(values[index - 1], lastValue, "Last non-zero value is wrong");
// }
// Release the array
objc_sendMsg_void(array, this.sel_release);
}