Files
yoga/src/__tests__/Layout-test.js

1153 lines
36 KiB
JavaScript
Raw Normal View History

/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
/* globals layoutTestUtils */
2014-03-30 17:12:38 -07:00
var testLayout = layoutTestUtils.testLayout;
2014-04-26 17:11:22 -07:00
var text = layoutTestUtils.text;
2014-09-19 18:36:18 -07:00
var texts = layoutTestUtils.texts;
var textSizes = layoutTestUtils.textSizes;
2014-03-30 17:12:38 -07:00
describe('Layout', function() {
it('should layout a single node with width and height', function() {
testLayout({
style: {width: 100, height: 200}
}, {
2014-03-30 19:33:24 -07:00
width: 100, height: 200, top: 0, left: 0
2014-03-30 19:18:06 -07:00
});
});
it('should layout node with children', function() {
testLayout(
{style: {width: 1000, height: 1000}, children: [
2014-03-30 19:18:06 -07:00
{style: {width: 500, height: 500}},
{style: {width: 250, height: 250}},
{style: {width: 125, height: 125}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-03-30 19:18:06 -07:00
{width: 500, height: 500, top: 0, left: 0},
{width: 250, height: 250, top: 500, left: 0},
{width: 125, height: 125, top: 750, left: 0}
]}
);
2014-03-30 17:12:38 -07:00
});
2014-03-30 19:33:24 -07:00
it('should layout node with nested children', function() {
testLayout(
{style: {width: 1000, height: 1000}, children: [
{style: {width: 500, height: 500}},
{style: {width: 500, height: 500}, children: [
2014-03-30 19:33:24 -07:00
{style: {width: 250, height: 250}},
{style: {width: 250, height: 250}}
]}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
{width: 500, height: 500, top: 0, left: 0},
{width: 500, height: 500, top: 500, left: 0, children: [
2014-03-30 19:33:24 -07:00
{width: 250, height: 250, top: 0, left: 0},
{width: 250, height: 250, top: 250, left: 0},
]}
]}
);
2014-03-30 19:33:24 -07:00
});
2014-03-30 19:51:14 -07:00
it('should layout node with margin', function() {
testLayout(
{style: {width: 100, height: 200, margin: 10}},
{width: 100, height: 200, top: 10, left: 10}
);
2014-03-30 19:51:14 -07:00
});
2014-03-30 20:33:40 -07:00
it('should layout node with several children', function() {
testLayout(
{style: {width: 1000, height: 1000, margin: 10}, children: [
2014-03-30 20:33:40 -07:00
{style: {width: 100, height: 100, margin: 50}},
{style: {width: 100, height: 100, margin: 25}},
{style: {width: 100, height: 100, margin: 10}}
]},
{width: 1000, height: 1000, top: 10, left: 10, children: [
2014-03-30 20:33:40 -07:00
{width: 100, height: 100, top: 50, left: 50},
{width: 100, height: 100, top: 225, left: 25},
{width: 100, height: 100, top: 360, left: 10}
]}
);
2014-03-30 20:33:40 -07:00
});
2014-03-31 11:09:33 -07:00
it('should layout node with row flex direction', function() {
testLayout(
{style: {width: 1000, height: 1000, flexDirection: 'row'}, children: [
2014-03-31 11:09:33 -07:00
{style: {width: 100, height: 200}},
{style: {width: 300, height: 150}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-03-31 11:09:33 -07:00
{width: 100, height: 200, top: 0, left: 0},
{width: 300, height: 150, top: 0, left: 100}
]}
);
2014-03-31 11:09:33 -07:00
});
it('should layout node based on children main dimensions', function() {
testLayout(
{style: {width: 300}, children: [
{style: {width: 100, height: 200}},
{style: {width: 300, height: 150}}
]},
{width: 300, height: 350, top: 0, left: 0, children: [
{width: 100, height: 200, top: 0, left: 0},
{width: 300, height: 150, top: 200, left: 0}
]}
);
});
2014-04-05 22:23:00 -07:00
it('should layout node with flex', function() {
testLayout(
{style: {width: 1000, height: 1000}, children: [
2014-04-05 22:23:00 -07:00
{style: {width: 100, height: 200}},
{style: {width: 100, flex: 1}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-04-05 22:23:00 -07:00
{width: 100, height: 200, top: 0, left: 0},
{width: 100, height: 800, top: 200, left: 0}
]}
);
2014-04-05 22:23:00 -07:00
});
2014-04-06 09:43:16 -07:00
it('should layout node with flex recursively', function() {
testLayout(
{style: {width: 1000, height: 1000}, children: [
{style: {width: 1000, flex: 1}, children: [
{style: {width: 1000, flex: 1}, children: [
{style: {width: 1000, flex: 1}}
]}
]}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
{width: 1000, height: 1000, top: 0, left: 0, children: [
{width: 1000, height: 1000, top: 0, left: 0, children: [
{width: 1000, height: 1000, top: 0, left: 0}
]}
]}
]}
);
2014-04-06 09:43:16 -07:00
});
2014-04-06 10:19:53 -07:00
2014-04-06 17:39:30 -07:00
it('should layout node with targeted margin', function() {
testLayout(
{style: {width: 1000, height: 1000, marginTop: 10, marginLeft: 5}, children: [
{style: {width: 100, height: 100, marginTop: 50, marginLeft: 15, marginBottom: 20}},
2014-04-06 10:19:53 -07:00
{style: {width: 100, height: 100, marginLeft: 30}}
]},
{width: 1000, height: 1000, top: 10, left: 5, children: [
2014-04-06 10:19:53 -07:00
{width: 100, height: 100, top: 50, left: 15},
{width: 100, height: 100, top: 170, left: 30}
]}
);
2014-04-06 10:19:53 -07:00
});
2014-04-06 17:39:30 -07:00
it('should layout node with justifyContent: flex-start', function() {
testLayout(
{style: {width: 1000, height: 1000, justifyContent: 'flex-start'}, children: [
2014-04-06 17:39:30 -07:00
{style: {width: 100, height: 100}},
{style: {width: 100, height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-04-06 17:39:30 -07:00
{width: 100, height: 100, top: 0, left: 0},
{width: 100, height: 100, top: 100, left: 0}
]}
);
2014-04-06 17:39:30 -07:00
});
it('should layout node with justifyContent: flex-end', function() {
testLayout(
{style: {width: 1000, height: 1000, justifyContent: 'flex-end'}, children: [
2014-04-06 17:39:30 -07:00
{style: {width: 100, height: 100}},
{style: {width: 100, height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-04-06 17:39:30 -07:00
{width: 100, height: 100, top: 800, left: 0},
{width: 100, height: 100, top: 900, left: 0}
]}
);
2014-04-06 17:39:30 -07:00
});
it('should layout node with justifyContent: space-between', function() {
testLayout(
{style: {width: 1000, height: 1000, justifyContent: 'space-between'}, children: [
2014-04-06 17:39:30 -07:00
{style: {width: 100, height: 100}},
{style: {width: 100, height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-04-06 17:39:30 -07:00
{width: 100, height: 100, top: 0, left: 0},
{width: 100, height: 100, top: 900, left: 0}
]}
);
2014-04-06 17:39:30 -07:00
});
it('should layout node with justifyContent: space-around', function() {
testLayout(
{style: {width: 1000, height: 1000, justifyContent: 'space-around'}, children: [
2014-04-06 17:39:30 -07:00
{style: {width: 100, height: 100}},
{style: {width: 100, height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-04-06 17:39:30 -07:00
{width: 100, height: 100, top: 200, left: 0},
{width: 100, height: 100, top: 700, left: 0}
]}
);
2014-04-06 17:39:30 -07:00
});
it('should layout node with justifyContent: center', function() {
testLayout(
{style: {width: 1000, height: 1000, justifyContent: 'center'}, children: [
2014-04-06 17:39:30 -07:00
{style: {width: 100, height: 100}},
{style: {width: 100, height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-04-06 17:39:30 -07:00
{width: 100, height: 100, top: 400, left: 0},
{width: 100, height: 100, top: 500, left: 0}
]}
);
2014-04-06 17:39:30 -07:00
});
2014-04-06 19:21:06 -07:00
it('should layout node with flex override height', function() {
testLayout(
{style: {width: 1000, height: 1000}, children: [
2014-04-06 19:21:06 -07:00
{style: {width: 100, height: 100, flex: 1}},
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-04-06 19:21:06 -07:00
{width: 100, height: 1000, top: 0, left: 0}
]}
);
2014-04-06 19:21:06 -07:00
});
it('should layout node with alignItems: flex-start', function() {
testLayout(
{style: {width: 1000, height: 1000, alignItems: 'flex-start'}, children: [
{style: {width: 200, height: 100}},
{style: {width: 100, height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
{width: 200, height: 100, top: 0, left: 0},
{width: 100, height: 100, top: 100, left: 0},
]}
);
});
it('should layout node with alignItems: center', function() {
testLayout(
{style: {width: 1000, height: 1000, alignItems: 'center'}, children: [
{style: {width: 200, height: 100}},
{style: {width: 100, height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
{width: 200, height: 100, top: 0, left: 400},
{width: 100, height: 100, top: 100, left: 450},
]}
);
});
it('should layout node with alignItems: flex-end', function() {
testLayout(
{style: {width: 1000, height: 1000, alignItems: 'flex-end'}, children: [
{style: {width: 200, height: 100}},
{style: {width: 100, height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
{width: 200, height: 100, top: 0, left: 800},
{width: 100, height: 100, top: 100, left: 900},
]}
);
});
it('should layout node with alignSelf overrides alignItems', function() {
testLayout(
{style: {width: 1000, height: 1000, alignItems: 'flex-end'}, children: [
{style: {width: 200, height: 100}},
{style: {width: 100, height: 100, alignSelf: 'center'}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
{width: 200, height: 100, top: 0, left: 800},
{width: 100, height: 100, top: 100, left: 450},
]}
);
});
2014-04-09 19:15:46 -07:00
it('should layout node with alignItem: stretch', function() {
testLayout(
{style: {width: 1000, height: 1000, alignItems: 'stretch'}, children: [
2014-04-09 19:15:46 -07:00
{style: {height: 100}}
]},
{width: 1000, height: 1000, top: 0, left: 0, children: [
2014-04-09 19:15:46 -07:00
{width: 1000, height: 100, top: 0, left: 0}
]}
);
2014-04-09 19:15:46 -07:00
});
2014-04-09 19:40:17 -07:00
it('should layout empty node', function() {
testLayout(
{style: {}, children: [
2014-04-09 19:40:17 -07:00
{style: {}}
]},
{width: 0, height: 0, top: 0, left: 0, children: [
2014-04-09 19:40:17 -07:00
{width: 0, height: 0, top: 0, left: 0}
]}
);
2014-04-09 19:40:17 -07:00
});
2014-04-10 09:29:06 -07:00
it('should layout child with margin', function() {
testLayout(
{style: {}, children: [
2014-04-10 09:29:06 -07:00
{style: {margin: 5}}
]},
{width: 10, height: 10, top: 0, left: 0, children: [
2014-04-10 09:29:06 -07:00
{width: 0, height: 0, top: 5, left: 5}
]}
);
2014-04-10 09:29:06 -07:00
});
2014-04-14 10:29:04 -07:00
it('should not shrink children if not enough space', function() {
testLayout(
{style: {height: 100}, children: [
2014-04-14 10:29:04 -07:00
{style: {height: 100}},
{style: {height: 200}},
]},
{width: 0, height: 100, top: 0, left: 0, children: [
2014-04-14 10:29:04 -07:00
{width: 0, height: 100, top: 0, left: 0},
{width: 0, height: 200, top: 100, left: 0}
]}
);
2014-04-14 10:29:04 -07:00
});
it('should layout for center', function() {
testLayout(
{style: {justifyContent: 'center'}},
{width: 0, height: 0, top: 0, left: 0}
);
});
it('should layout flex-end taking into account margin', function() {
testLayout(
{style: {height: 100, justifyContent: 'flex-end'}, children: [
{style: {marginTop: 10}}
]},
{width: 0, height: 100, top: 0, left: 0, children: [
{width: 0, height: 0, top: 100, left: 0}
]}
);
});
it('should layout alignItems with margin', function() {
testLayout(
{style: {}, children: [
{style: {alignItems: 'flex-end'}, children: [
{style: {margin: 10}},
{style: {height: 100}}
]}
]},
2014-04-15 16:39:42 -07:00
{width: 20, height: 120, top: 0, left: 0, children: [
{width: 20, height: 120, top: 0, left: 0, children: [
{width: 0, height: 0, top: 10, left: 10},
{width: 0, height: 100, top: 20, left: 20}
]}
]}
);
});
2014-04-15 16:39:42 -07:00
it('should layout flex inside of an empty element', function() {
testLayout(
{style: {}, children: [
{style: {flex: 1}},
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 0}
]}
);
});
2014-04-15 17:53:38 -07:00
it('should layout alignItems stretch and margin', function() {
testLayout(
{style: {alignItems: 'stretch'}, children: [
{style: {marginLeft: 10}}
]},
{width: 10, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 10}
]}
);
});
it('should layout node with padding', function() {
testLayout(
{style: {padding: 5}},
{width: 10, height: 10, top: 0, left: 0}
);
});
2014-04-16 12:49:31 -07:00
it('should layout node with padding and a child', function() {
testLayout(
{style: {padding: 5}, children: [
{style: {}}
]},
{width: 10, height: 10, top: 0, left: 0, children: [
{width: 0, height: 0, top: 5, left: 5}
]}
);
});
2014-04-16 13:15:00 -07:00
it('should layout node with padding and a child with margin', function() {
testLayout(
{style: {padding: 5}, children: [
{style: {margin: 5}}
]},
{width: 20, height: 20, top: 0, left: 0, children: [
{width: 0, height: 0, top: 10, left: 10}
]}
);
});
2014-04-16 13:21:30 -07:00
it('should layout node with padding and stretch', function() {
testLayout(
{style: {}, children: [
{style: {padding: 10, alignSelf: 'stretch'}}
]},
{width: 20, height: 20, top: 0, left: 0, children: [
{width: 20, height: 20, top: 0, left: 0}
]}
);
});
2014-04-16 13:32:05 -07:00
it('should layout node with inner & outer padding and stretch', function() {
testLayout(
{style: {padding: 50}, children: [
{style: {padding: 10, alignSelf: 'stretch'}}
]},
{width: 120, height: 120, top: 0, left: 0, children: [
{width: 20, height: 20, top: 50, left: 50}
]}
);
});
2014-04-16 15:09:53 -07:00
it('should layout node with stretch and child with margin', function() {
testLayout(
{style: {}, children: [
{style: {alignSelf: 'stretch'}, children: [
{style: {margin: 16}}
]}
]},
{width: 32, height: 32, top: 0, left: 0, children: [
{width: 32, height: 32, top: 0, left: 0, children: [
{width: 0, height: 0, top: 16, left: 16}
]}
]}
);
});
2014-04-16 16:12:24 -07:00
it('should layout node with top and left', function() {
2014-04-16 15:26:15 -07:00
testLayout(
{style: {top: 5, left: 5}},
{width: 0, height: 0, top: 5, left: 5}
);
});
2014-04-16 16:12:24 -07:00
it('should layout node with height, padding and space-around', function() {
testLayout(
2014-04-22 09:48:33 -07:00
{style: {height: 10, paddingTop: 5, justifyContent: 'space-around'}, children: [
2014-04-16 16:12:24 -07:00
{style: {}}
]},
{width: 0, height: 10, top: 0, left: 0, children: [
{width: 0, height: 0, top: 7.5, left: 0}
]}
);
});
2014-04-16 16:31:38 -07:00
it('should layout node with bottom', function() {
testLayout(
{style: {bottom: 5}},
{width: 0, height: 0, top: -5, left: 0}
);
});
it('should layout node with both top and bottom', function() {
testLayout(
{style: {top: 10, bottom: 5}},
{width: 0, height: 0, top: 10, left: 0}
);
});
it('should layout node with position: absolute', function() {
testLayout(
{style: {width: 500, flexDirection: 'row'}, children: [
{style: {flex: 1}},
{style: {position: 'absolute', width: 50}},
{style: {flex: 1}},
]},
{width: 500, height: 0, top: 0, left: 0, children: [
{width: 250, height: 0, top: 0, left: 0},
{width: 50, height: 0, top: 0, left: 250},
{width: 250, height: 0, top: 0, left: 250}
]}
);
});
it('should layout node with child with position: absolute and margin', function() {
testLayout(
{style: {}, children: [
{style: {marginRight: 15, position: 'absolute'}}
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 0}
]}
);
});
2014-04-21 14:58:44 -07:00
it('should layout node with position: absolute, padding and alignSelf: center', function() {
testLayout(
{style: {}, children: [
2014-04-21 14:58:44 -07:00
{style: {paddingRight: 12, alignSelf: 'center', position: 'absolute'}}
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 12, height: 0, top: 0, left: 0}
]}
);
2014-04-21 16:52:53 -07:00
});
2014-04-21 14:58:44 -07:00
it('should work with height smaller than paddingBottom', function() {
testLayout(
{style: {height: 5, paddingBottom: 20}},
{width: 0, height: 20, top: 0, left: 0}
);
});
it('should work with width smaller than paddingLeft', function() {
testLayout(
{style: {width: 5, paddingLeft: 20}},
{width: 20, height: 0, top: 0, left: 0}
);
});
it('should layout node with specified width and stretch', function() {
testLayout(
{style: {}, children: [{
style: {}, children: [
{style: {width: 400}}
]},
{style: {width: 200, alignSelf: 'stretch'}}
]},
{width: 400, height: 0, top: 0, left: 0, children: [
{width: 400, height: 0, top: 0, left: 0, children: [
{width: 400, height: 0, top: 0, left: 0}
]},
{width: 200, height: 0, top: 0, left: 0}
]}
);
});
2014-04-21 18:34:28 -07:00
it('should layout node with padding and child with position absolute', function() {
testLayout(
{style: {padding: 5}, children: [
{style: {position: 'absolute'}}
]},
{width: 10, height: 10, top: 0, left: 0, children: [
{width: 0, height: 0, top: 5, left: 5}
]}
);
});
2014-04-21 18:34:28 -07:00
it('should layout node with position absolute, top and left', function() {
testLayout(
{style: {}, children: [
{style: {height: 100}},
{style: {position: 'absolute', top: 10, left: 10}}
]},
{width: 0, height: 100, top: 0, left: 0, children: [
{width: 0, height: 100, top: 0, left: 0},
{width: 0, height: 0, top: 10, left: 10}
]}
);
});
2014-04-21 18:40:00 -07:00
it('should layout node with padding and child position absolute, left', function() {
testLayout(
{style: {padding: 20}, children: [
{style: {left: 5, position: 'absolute'}}
]},
{width: 40, height: 40, top: 0, left: 0, children: [
{width: 0, height: 0, top: 20, left: 5}
]}
);
});
2014-04-21 18:45:01 -07:00
it('should layout node with position: absolute, top and marginTop', function() {
testLayout(
{style: {}, children: [
{style: {top: 5, marginTop: 5, position: 'absolute'}}
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: 10, left: 0}
]}
);
});
2014-04-21 18:45:57 -07:00
it('should layout node with position: absolute, left and marginLeft', function() {
testLayout(
{style: {}, children: [
{style: {left: 5, marginLeft: 5, position: 'absolute'}}
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 10}
]}
);
});
it('should layout node with space-around and child position absolute', function() {
testLayout(
{style: {height: 200, justifyContent: 'space-around'}, children: [
{style: {position: 'absolute'}},
{style: {}}
]},
{width: 0, height: 200, top: 0, left: 0, children: [
{width: 0, height: 0, top: 100, left: 0},
{width: 0, height: 0, top: 100, left: 0}
]}
);
2014-04-22 09:38:17 -07:00
});
2014-04-22 09:48:33 -07:00
it('should layout node with flex and main margin', function() {
2014-04-22 09:38:17 -07:00
testLayout(
{style: {width: 700, flexDirection: 'row'}, children: [
{style: {marginLeft: 5, flex: 1}}
]},
{width: 700, height: 0, top: 0, left: 0, children: [
{width: 695, height: 0, top: 0, left: 5}
]}
);
});
2014-04-22 09:48:33 -07:00
it('should layout node with multiple flex and padding', function() {
testLayout(
{style: {width: 700, flexDirection: 'row'}, children: [
{style: {flex: 1}},
{style: {paddingRight: 5, flex: 1}}
]},
{width: 700, height: 0, top: 0, left: 0, children: [
{width: 347.5, height: 0, top: 0, left: 0},
{width: 352.5, height: 0, top: 0, left: 347.5}
]}
);
});
2014-04-22 09:53:54 -07:00
it('should layout node with multiple flex and margin', function() {
testLayout(
{style: {width: 700, flexDirection: 'row'}, children: [
{style: {flex: 1}},
{style: {marginLeft: 5, flex: 1}}
]},
{width: 700, height: 0, top: 0, left: 0, children: [
{width: 347.5, height: 0, top: 0, left: 0},
{width: 347.5, height: 0, top: 0, left: 352.5}
]}
)
});
2014-04-22 09:48:33 -07:00
2014-04-22 09:56:48 -07:00
it('should layout node with flex and overflow', function() {
testLayout(
{style: {height: 300}, children: [
{style: {height: 600}},
{style: {flex: 1}}
]},
{width: 0, height: 300, top: 0, left: 0, children: [
{width: 0, height: 600, top: 0, left: 0},
{width: 0, height: 0, top: 600, left: 0}
]}
);
});
2014-04-22 10:02:33 -07:00
it('should layout node with flex and position absolute', function() {
testLayout(
{style: {width: 600, flexDirection: 'row'}, children: [
{style: {flex: 1, position: 'absolute'}}
]},
{width: 600, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 0}
]}
);
});
2014-04-22 10:21:17 -07:00
it('should layout node with double flex and position absolute', function() {
testLayout(
{style: {height: 500}, children: [
{style: {flex: 1}},
{style: {flex: 1, position: 'absolute'}}
]},
{width: 0, height: 500, top: 0, left: 0, children: [
{width: 0, height: 500, top: 0, left: 0},
{width: 0, height: 0, top: 500, left: 0},
]}
)
});
2014-04-22 09:56:48 -07:00
2014-04-22 11:31:42 -07:00
it('should layout node with borderWidth', function() {
testLayout(
{style: {borderWidth: 5}},
{width: 10, height: 10, top: 0, left: 0}
)
});
2014-09-11 09:23:30 -07:00
it('should layout node with borderWidth and position: absolute, top', function() {
testLayout(
{style: {borderTopWidth: 1}, children: [
{style: {top: -1, position: 'absolute'}}
]},
{width: 0, height: 1, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 0}
]}
)
});
2014-09-11 09:23:30 -07:00
it('should layout node with borderWidth and position: absolute, top. cross axis', function() {
testLayout(
{style: {borderWidth: 1}, children: [
{style: {left: 5, position: 'absolute'}}
]},
{width: 2, height: 2, top: 0, left: 0, children: [
{width: 0, height: 0, top: 1, left: 6}
]}
)
});
it('should correctly take into account min padding for stretch', function() {
testLayout(
{style: {width: 50}, children: [
{style: {marginLeft: 20, padding: 20, alignSelf: 'stretch'}}
]},
{width: 50, height: 40, top: 0, left: 0, children: [
{width: 40, height: 40, top: 0, left: 20}
]}
);
});
2014-04-22 17:19:21 -07:00
it('should layout node with negative width', function() {
testLayout(
{style: {width: -31}, children: [
{style: {borderRightWidth: 5}}
]},
{width: 5, height: 0, top: 0, left: 0, children: [
{width: 5, height: 0, top: 0, left: 0}
]}
);
});
it('should handle negative margin and min padding correctly', function() {
testLayout(
{style: {borderRightWidth: 1, flexDirection: 'row'}, children: [
{style: {marginRight: -8}}
]},
{width: 1, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 0}
]}
);
});
2014-04-22 17:19:21 -07:00
2014-04-26 19:02:16 -07:00
it('should layout node with just text', function() {
2014-04-26 12:16:27 -07:00
testLayout(
2014-09-19 18:36:18 -07:00
{style: {measure: text(texts.small)}},
{width: textSizes.smallWidth, height: textSizes.smallHeight, top: 0, left: 0}
);
});
it('should layout node with text and width', function() {
testLayout(
2014-09-19 18:36:18 -07:00
{style: {measure: text(texts.small), width: 10}},
{width: 10, height: textSizes.smallHeight, top: 0, left: 0}
);
2014-04-26 12:16:27 -07:00
});
2014-04-26 19:02:16 -07:00
it('should layout node with text, padding and margin', function() {
2014-04-26 17:11:22 -07:00
testLayout(
2014-09-19 18:36:18 -07:00
{style: {measure: text(texts.big)}},
{width: textSizes.bigWidth, height: textSizes.smallHeight, top: 0, left: 0}
);
2014-04-26 19:02:16 -07:00
});
it('should layout node with nested alignSelf: stretch', function() {
testLayout(
{style: {width: 300}, children: [
{style: {alignSelf: 'stretch'}, children: [
{style: {alignSelf: 'stretch'}}
]}
]},
{width: 300, height: 0, top: 0, left: 0, children: [
{width: 300, height: 0, top: 0, left: 0, children: [
{width: 300, height: 0, top: 0, left: 0}
]}
]}
);
});
2014-04-22 09:56:48 -07:00
it('should layout node with text and flex', function() {
testLayout(
{style: {}, children: [
{style: {width: 500, flexDirection: 'row'}, children: [
2014-09-19 18:36:18 -07:00
{style: {flex: 1, measure: text(texts.big)}}
]}
]},
{width: 500, height: textSizes.smallHeight, top: 0, left: 0, children: [
{width: 500, height: textSizes.smallHeight, top: 0, left: 0, children: [
{width: 500, height: textSizes.smallHeight, top: 0, left: 0}
]}
]}
);
});
it('should layout node with text and stretch', function() {
testLayout(
{style: {width: 130}, children: [
{style: {alignSelf: 'stretch', alignItems: 'stretch'}, children: [
2014-09-19 18:36:18 -07:00
{style: {measure: text(texts.big)}}
]}
]},
{width: 130, height: textSizes.bigHeight, top: 0, left: 0, children: [
{width: 130, height: textSizes.bigHeight, top: 0, left: 0, children: [
{width: 130, height: textSizes.bigHeight, top: 0, left: 0}
]}
]}
);
});
it('should layout node with text stretch and width', function() {
testLayout(
{style: {width: 200}, children: [
{style: {alignSelf: 'stretch', alignItems: 'stretch'}, children: [
2014-09-19 18:36:18 -07:00
{style: {width: 130, measure: text(texts.big)}}
]}
]},
{width: 200, height: textSizes.bigHeight, top: 0, left: 0, children: [
{width: 200, height: textSizes.bigHeight, top: 0, left: 0, children: [
{width: 130, height: textSizes.bigHeight, top: 0, left: 0}
]}
]}
);
});
it('should layout node with text bounded by parent', function() {
testLayout(
2014-10-08 09:35:44 -07:00
{style: {width: 100, alignSelf: 'flex-start'}, children: [
{style: {measure: text(texts.big), alignSelf: 'flex-start'}}
]},
{width: 100, height: textSizes.bigHeight, top: 0, left: 0, children: [
{width: textSizes.bigMinWidth, height: textSizes.bigHeight, top: 0, left: 0}
]}
);
});
it('should layout node with text bounded by grand-parent', function() {
testLayout(
2014-10-08 09:35:44 -07:00
{style: {width: 100, padding: 10, alignSelf: 'flex-start'}, children: [
{style: {margin: 10, alignSelf: 'flex-start'}, children: [
2014-09-19 18:36:18 -07:00
{style: {measure: text(texts.big)}}
]}
]},
{width: 100, height: 40 + textSizes.bigHeight, top: 0, left: 0, children: [
{width: textSizes.bigMinWidth, height: textSizes.bigHeight, top: 20, left: 20, children: [
{width: textSizes.bigMinWidth, height: textSizes.bigHeight, top: 0, left: 0}
]}
]}
);
});
it('should layout space-between when remaining space is negative', function() {
testLayout(
{style: {height: 100, justifyContent: 'space-between'}, children: [
{style: {height: 900}},
{style: {}}
]},
{width: 0, height: 100, top: 0, left: 0, children: [
{width: 0, height: 900, top: 0, left: 0},
{width: 0, height: 0, top: 900, left: 0}
]}
);
});
it('should layout flex-end when remaining space is negative', function() {
testLayout(
{style: {width: 200, flexDirection: 'row', justifyContent: 'flex-end'}, children: [
{style: {width: 900}}
]},
{width: 200, height: 0, top: 0, left: 0, children: [
{width: 900, height: 0, top: 0, left: -700}
]}
);
});
it('should layout text with flexDirection row', function() {
testLayout(
{style: {}, children: [
{style: {width: 200, flexDirection: 'row'}, children: [
2014-09-19 18:36:18 -07:00
{style: {margin: 20, measure: text(texts.big)}}
]}
]},
{width: 200, height: 58, top: 0, left: 0, children: [
{width: 200, height: 58, top: 0, left: 0, children: [
{width: textSizes.bigWidth, height: textSizes.smallHeight, top: 20, left: 20}
]}
]}
);
});
it('should layout with text and margin', function() {
testLayout(
{style: {}, children: [
{style: {width: 200}, children: [
2014-09-19 18:36:18 -07:00
{style: {margin: 20, measure: text(texts.big)}}
]}
]},
{width: 200, height: 76, top: 0, left: 0, children: [
{width: 200, height: 76, top: 0, left: 0, children: [
{width: 160, height: textSizes.bigHeight, top: 20, left: 20}
]}
]}
);
});
2014-09-11 09:23:30 -07:00
it('should layout with position absolute, top, left, bottom, right', function() {
2014-06-11 21:44:46 -07:00
testLayout(
2014-09-11 09:23:30 -07:00
{style: {width: 100, height: 100}, children: [
{style: {position: 'absolute', top: 0, left: 0, bottom: 0, right: 0}}
2014-06-12 11:36:57 -07:00
]},
2014-09-11 09:23:30 -07:00
{width: 100, height: 100, top: 0, left: 0, children: [
{width: 100, height: 100, top: 0, left: 0}
2014-06-12 11:36:57 -07:00
]}
);
});
2014-09-11 09:23:30 -07:00
it('should layout with arbitrary flex', function() {
2014-06-12 11:43:30 -07:00
testLayout(
2014-10-08 09:35:44 -07:00
{style: {width: 100, height: 100, alignSelf: 'flex-start'}, children: [
{style: {flex: 2.5, alignSelf: 'flex-start'}},
{style: {flex: 7.5, alignSelf: 'flex-start'}}
2014-06-12 11:43:30 -07:00
]},
2014-09-11 09:23:30 -07:00
{width: 100, height: 100, top: 0, left: 0, children: [
{width: 0, height: 25, top: 0, left: 0},
{width: 0, height: 75, top: 25, left: 0},
2014-06-12 11:43:30 -07:00
]}
);
});
2014-09-11 09:23:30 -07:00
it('should layout with negative flex', function() {
testLayout(
2014-10-08 09:35:44 -07:00
{style: {width: 100, height: 100, alignSelf: 'flex-start'}, children: [
{style: {flex: -2.5, alignSelf: 'flex-start'}},
{style: {flex: 0, alignSelf: 'flex-start'}}
]},
2014-09-11 09:23:30 -07:00
{width: 100, height: 100, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 0},
{width: 0, height: 0, top: 0, left: 0},
]}
);
});
2014-09-29 14:07:47 -07:00
it('should layout with position: absolute and another sibling', function() {
testLayout(
{style: {}, children: [
{style: {width: 50, height: 100}},
{style: {position: 'absolute', left: 0, right: 0}}
]},
{width: 50, height: 100, top: 0, left: 0, children: [
{width: 50, height: 100, top: 0, left: 0},
{width: 50, height: 0, top: 100, left: 0},
]}
);
});
it('should calculate height properly with position: absolute top and bottom', function() {
testLayout(
{style: {height: 100}, children: [
{style: {position: 'absolute', top: 0, bottom: 20}}
]},
{width: 0, height: 100, top: 0, left: 0, children: [
{width: 0, height: 80, top: 0, left: 0}
]}
);
});
it('should layout with complicated position: absolute and justifyContent: center combo', function() {
testLayout(
{style: {width: 200, height: 200}, children: [
{style: {position: 'absolute', justifyContent: 'center', top: 0, left: 0, right: 0, bottom: 0}, children: [
{style: {width: 100, height: 100}}
]}
]},
{width: 200, height: 200, top: 0, left: 0, children: [
{width: 200, height: 200, top: 0, left: 0, children: [
{width: 100, height: 100, top: 50, left: 0}
]}
]}
);
});
it('should calculate top properly with position: absolute bottom', function() {
testLayout(
{style: {height: 100}, children: [
{style: {position: 'absolute', bottom: 0}}
]},
{width: 0, height: 100, top: 0, left: 0, children: [
{width: 0, height: 0, top: 100, left: 0}
]}
);
});
it('should calculate left properly with position: absolute right', function() {
testLayout(
{style: {width: 100}, children: [
{style: {position: 'absolute', right: 0}}
]},
{width: 100, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 100}
]}
);
});
it('should calculate top properly with position: absolute bottom and height', function() {
testLayout(
{style: {height: 100}, children: [
{style: {height: 10, position: 'absolute', bottom: 0}}
]},
{width: 0, height: 100, top: 0, left: 0, children: [
{width: 0, height: 10, top: 90, left: 0}
]}
);
});
it('should calculate left properly with position: absolute right and width', function() {
testLayout(
{style: {width: 100}, children: [
{style: {width: 10, position: 'absolute', right: 0}}
]},
{width: 100, height: 0, top: 0, left: 0, children: [
{width: 10, height: 0, top: 0, left: 90}
]}
);
});
it('should calculate top properly with position: absolute right, width, and no parent dimensions', function() {
testLayout(
{style: {}, children: [
{style: {height: 10, position: 'absolute', bottom: 0}}
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 0, height: 10, top: -10, left: 0}
]}
);
});
2014-12-11 13:57:03 +00:00
it('should calculate left properly with position: absolute right, width, and no parent dimensions', function() {
2014-09-30 13:11:32 -07:00
testLayout(
{style: {}, children: [
{style: {width: 10, position: 'absolute', right: 0}}
2014-09-30 13:11:32 -07:00
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 10, height: 0, top: 0, left: -10}
2014-09-30 13:11:32 -07:00
]}
);
});
it('should layout border bottom inside of justify content space between container', function() {
testLayout(
{style: {justifyContent: 'space-between'}, children: [
{style: {borderBottomWidth: 1}}
]},
{width: 0, height: 1, top: 0, left: 0, children: [
{width: 0, height: 1, top: 0, left: 0}
]}
);
});
it('should layout negative margin top inside of justify content center container', function() {
testLayout(
{style: {justifyContent: 'center'}, children: [
{style: {marginTop: -6}}
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 0, height: 0, top: -3, left: 0}
]}
);
});
it('should layout positive margin top inside of justify content center container', function() {
testLayout(
{style: {justifyContent: 'center'}, children: [
{style: {marginTop: 20}}
]},
{width: 0, height: 20, top: 0, left: 0, children: [
{width: 0, height: 0, top: 20, left: 0}
]}
);
});
it('should layout border bottom and flex end with an empty child', function() {
testLayout(
{style: {borderBottomWidth: 5, justifyContent: 'flex-end'}, children: [
{style: {}}
]},
{width: 0, height: 5, top: 0, left: 0, children: [
{width: 0, height: 0, top: 0, left: 0}
]}
);
});
2014-12-11 15:58:45 +00:00
it('should layout with children of a contain with left', function() {
testLayout(
{style: {width: 800}, children: [
{style: {left: 5}, children: [
{style: {}}
]}
]},
{width: 800, height: 0, top: 0, left: 0, children: [
{width: 800, height: 0, top: 0, left: 5, children: [
{width: 800, height: 0, top: 0, left: 0}
]}
]}
);
});
2014-12-11 13:57:03 +00:00
xit('should layout flex-wrap', function() {
testLayout(
{style: {flexWrap: 'wrap', flexDirection: 'row', width: 100}, children: [
{style: {width: 40, height: 10}},
{style: {width: 40, height: 10}},
{style: {flex: 1}},
{style: {width: 40, height: 10}},
]},
{width: 100, height: 20, top: 0, left: 0, children: [
{width: 40, height: 10, top: 0, left: 0},
{width: 40, height: 10, top: 0, left: 40},
{width: 40, height: 10, top: 10, left: 0}
]}
);
});
xit('should layout text with alignItems: stretch', function() {
2014-09-30 13:11:32 -07:00
testLayout(
{style: {width: 80, padding: 7, alignItems: 'stretch', measure: text(texts.big)}},
{width: 80, height: 68, top: 0, left: 0}
);
});
xit('should layout node with text and position absolute', function() {
testLayout(
{style: {}, children: [
{style: {measure: text(texts.big)}}
2014-09-30 13:11:32 -07:00
]},
{width: 0, height: 0, top: 0, left: 0, children: [
{width: 100, height: textSizes.bigHeight, top: 0, left: 0}
2014-09-30 13:11:32 -07:00
]}
);
});
2014-03-30 17:12:38 -07:00
});