302
});
303
});
304
305
+ it('should call FabricUIManager.measure on ref.measure', () => {
306
+ const View = createReactNativeComponentClass('RCTView', () => ({
307
+ validAttributes: {foo: true},
308
+ uiViewClassName: 'RCTView',
309
+ }));
310
+
311
+ class Subclass extends ReactFabric.NativeComponent {
312
+ render() {
313
+ return <View>{this.props.children}</View>;
314
+ }
315
+ }
316
+
317
+ const CreateClass = createReactClass({
318
+ mixins: [NativeMethodsMixin],
319
+ render() {
320
+ return <View>{this.props.children}</View>;
321
+ },
322
+ });
323
+
324
+ [View, Subclass, CreateClass].forEach(Component => {
325
+ FabricUIManager.measure.mockClear();
326
+
327
+ let viewRef;
328
+ ReactFabric.render(
329
+ <Component
330
+ ref={ref => {
331
+ viewRef = ref;
332
+ }}
333
+ />,
334
+ 11,
335
+ );
336
+
337
+ expect(FabricUIManager.measure).not.toBeCalled();
338
+ const successCallback = jest.fn();
339
+ viewRef.measure(successCallback);
340
+ expect(FabricUIManager.measure).toHaveBeenCalledTimes(1);
341
+ expect(successCallback).toHaveBeenCalledTimes(1);
342
+ expect(successCallback).toHaveBeenCalledWith(10, 10, 100, 100, 0, 0);
343
+ });
344
+ });
345
+
346
+ it('should call FabricUIManager.measureInWindow on ref.measureInWindow', () => {
347
+ const View = createReactNativeComponentClass('RCTView', () => ({
348
+ validAttributes: {foo: true},
349
+ uiViewClassName: 'RCTView',
350
+ }));
351
+
352
+ class Subclass extends ReactFabric.NativeComponent {
353
+ render() {
354
+ return <View>{this.props.children}</View>;
355
+ }
356
+ }
357
+
358
+ const CreateClass = createReactClass({
359
+ mixins: [NativeMethodsMixin],
360
+ render() {
361
+ return <View>{this.props.children}</View>;
362
+ },
363
+ });
364
+
365
+ [View, Subclass, CreateClass].forEach(Component => {
366
+ FabricUIManager.measureInWindow.mockClear();
367
+
368
+ let viewRef;
369
+ ReactFabric.render(
370
+ <Component
371
+ ref={ref => {
372
+ viewRef = ref;
373
+ }}
374
+ />,
375
+ 11,
376
+ );
377
+
378
+ expect(FabricUIManager.measureInWindow).not.toBeCalled();
379
+ const successCallback = jest.fn();
380
+ viewRef.measureInWindow(successCallback);
381
+ expect(FabricUIManager.measureInWindow).toHaveBeenCalledTimes(1);
382
+ expect(successCallback).toHaveBeenCalledTimes(1);
383
+ expect(successCallback).toHaveBeenCalledWith(10, 10, 100, 100);
384
+ });
385
+ });
386
+
387
it('should support ref in ref.measureLayout', () => {
388
const View = createReactNativeComponentClass('RCTView', () => ({
389
validAttributes: {foo: true},
391
}));
392
393
[View].forEach(Component => {
312
- UIManager.measureLayout.mockReset();
394
+ FabricUIManager.measureLayout.mockClear();
395
396
let viewRef;
397
let otherRef;
412
11,
413
);
414
333
- expect(UIManager.measureLayout).not.toBeCalled();
334
-
415
+ expect(FabricUIManager.measureLayout).not.toBeCalled();
416
const successCallback = jest.fn();
417
const failureCallback = jest.fn();
418
viewRef.measureLayout(otherRef, successCallback, failureCallback);
419
+ expect(FabricUIManager.measureLayout).toHaveBeenCalledTimes(1);
420
+ expect(successCallback).toHaveBeenCalledTimes(1);
421
+ expect(successCallback).toHaveBeenCalledWith(1, 1, 100, 100);
422
+ });
423
+ });
424
+
425
+ it('should warn when calling measureLayout on Subclass and NativeMethodsMixin', () => {
426
+ const View = createReactNativeComponentClass('RCTView', () => ({
427
+ validAttributes: {foo: true},
428
+ uiViewClassName: 'RCTView',
429
+ }));
430
+
431
+ class Subclass extends ReactFabric.NativeComponent {
432
+ render() {
433
+ return <View>{this.props.children}</View>;
434
+ }
435
+ }
436
+
437
+ const CreateClass = createReactClass({
438
+ mixins: [NativeMethodsMixin],
439
+ render() {
440
+ return <View>{this.props.children}</View>;
441
+ },
442
+ });
443
339
- expect(UIManager.measureLayout).toHaveBeenCalledTimes(1);
340
- expect(UIManager.measureLayout).toHaveBeenCalledWith(
341
- expect.any(Number),
342
- expect.any(Number),
343
- expect.any(Function),
344
- expect.any(Function),
444
+ [Subclass, CreateClass].forEach(Component => {
445
+ FabricUIManager.measureLayout.mockReset();
446
+
447
+ let viewRef;
448
+ let otherRef;
449
+ ReactFabric.render(
450
+ <Component>
451
+ <Component
452
+ foo="bar"
453
+ ref={ref => {
454
+ viewRef = ref;
455
+ }}
456
+ />
457
+ <View
458
+ ref={ref => {
459
+ otherRef = ref;
460
+ }}
461
+ />
462
+ </Component>,
463
+ 11,
464
);
465
347
- const args = UIManager.measureLayout.mock.calls[0];
348
- expect(args[0]).not.toEqual(args[1]);
349
- expect(successCallback).not.toBeCalled();
350
- expect(failureCallback).not.toBeCalled();
351
- args[2]('fail');
352
- expect(failureCallback).toBeCalledWith('fail');
466
+ const successCallback = jest.fn();
467
+ const failureCallback = jest.fn();
468
+
469
+ expect(() => {
470
+ viewRef.measureLayout(otherRef, successCallback, failureCallback);
471
+ }).toWarnDev(
472
+ [
473
+ 'Warning: measureLayout on components using NativeMethodsMixin ' +
474
+ 'or ReactNative.NativeComponent is not currently supported in Fabric. ' +
475
+ 'measureLayout must be called on a native ref. Consider using forwardRef.',
476
+ ],
477
+ {
478
+ withoutStack: true,
479
+ },
480
+ );
481
354
- expect(successCallback).not.toBeCalled();
355
- args[3]('success');
356
- expect(successCallback).toBeCalledWith('success');
482
+ expect(FabricUIManager.measureLayout).not.toBeCalled();
483
+ expect(UIManager.measureLayout).not.toBeCalled();
484
});
485
});
486