xref: /aosp_15_r20/external/harfbuzz_ng/src/test-subset-instancer-solver.cc (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2023  Google, Inc.
3*2d1272b8SAndroid Build Coastguard Worker  *
4*2d1272b8SAndroid Build Coastguard Worker  *  This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker  *
6*2d1272b8SAndroid Build Coastguard Worker  * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker  * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker  * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker  * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker  * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker  *
12*2d1272b8SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker  * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker  *
18*2d1272b8SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker  *
24*2d1272b8SAndroid Build Coastguard Worker  * Google Author(s): Qunxin Liu
25*2d1272b8SAndroid Build Coastguard Worker  */
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker #include <math.h>
28*2d1272b8SAndroid Build Coastguard Worker #include "hb-subset-instancer-solver.hh"
29*2d1272b8SAndroid Build Coastguard Worker 
approx(Triple a,Triple b)30*2d1272b8SAndroid Build Coastguard Worker static inline bool approx (Triple a, Triple b)
31*2d1272b8SAndroid Build Coastguard Worker {
32*2d1272b8SAndroid Build Coastguard Worker   return abs (a.minimum - b.minimum) < 0.000001 &&
33*2d1272b8SAndroid Build Coastguard Worker          abs (a.middle - b.middle) < 0.000001 &&
34*2d1272b8SAndroid Build Coastguard Worker          abs (a.maximum - b.maximum) < 0.000001;
35*2d1272b8SAndroid Build Coastguard Worker }
36*2d1272b8SAndroid Build Coastguard Worker 
approx(double a,double b)37*2d1272b8SAndroid Build Coastguard Worker static inline bool approx (double a, double b)
38*2d1272b8SAndroid Build Coastguard Worker { return abs (a - b) < 0.000001; }
39*2d1272b8SAndroid Build Coastguard Worker 
40*2d1272b8SAndroid Build Coastguard Worker /* tests ported from
41*2d1272b8SAndroid Build Coastguard Worker  * https://github.com/fonttools/fonttools/blob/main/Tests/varLib/instancer/solver_test.py */
42*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)43*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
44*2d1272b8SAndroid Build Coastguard Worker {
45*2d1272b8SAndroid Build Coastguard Worker   TripleDistances default_axis_distances{1.0, 1.0};
46*2d1272b8SAndroid Build Coastguard Worker   /* Case 1 */
47*2d1272b8SAndroid Build Coastguard Worker   {
48*2d1272b8SAndroid Build Coastguard Worker     /* pin axis*/
49*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 1.0, 1.0);
50*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.0, 0.0);
51*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
52*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 0);
53*2d1272b8SAndroid Build Coastguard Worker   }
54*2d1272b8SAndroid Build Coastguard Worker 
55*2d1272b8SAndroid Build Coastguard Worker   {
56*2d1272b8SAndroid Build Coastguard Worker     /* pin axis*/
57*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 1.0, 1.0);
58*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.5, 0.5, 0.5);
59*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
60*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
61*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 0.5);
62*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
63*2d1272b8SAndroid Build Coastguard Worker   }
64*2d1272b8SAndroid Build Coastguard Worker 
65*2d1272b8SAndroid Build Coastguard Worker   {
66*2d1272b8SAndroid Build Coastguard Worker     /* tent falls outside the new axis range */
67*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.3, 0.5, 0.8);
68*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.1, 0.2, 0.3);
69*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
70*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 0);
71*2d1272b8SAndroid Build Coastguard Worker   }
72*2d1272b8SAndroid Build Coastguard Worker 
73*2d1272b8SAndroid Build Coastguard Worker   /* Case 2 */
74*2d1272b8SAndroid Build Coastguard Worker   {
75*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 1.0, 1.0);
76*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, 0.0, 0.5);
77*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
78*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
79*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 0.5);
80*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (0.0, 1.0, 1.0));
81*2d1272b8SAndroid Build Coastguard Worker   }
82*2d1272b8SAndroid Build Coastguard Worker 
83*2d1272b8SAndroid Build Coastguard Worker   /* Case 2 */
84*2d1272b8SAndroid Build Coastguard Worker   {
85*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 1.0, 1.0);
86*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, 0.0, 0.75);
87*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
88*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
89*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 0.75);
90*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (0.0, 1.0, 1.0));
91*2d1272b8SAndroid Build Coastguard Worker   }
92*2d1272b8SAndroid Build Coastguard Worker 
93*2d1272b8SAndroid Build Coastguard Worker   /* Without gain: */
94*2d1272b8SAndroid Build Coastguard Worker   /* Case 3 */
95*2d1272b8SAndroid Build Coastguard Worker   {
96*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.2, 1.0);
97*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, 0.0, 0.8);
98*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
99*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 2);
100*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
101*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (0.0, 0.25, 1.0));
102*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].first, 0.250));
103*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.25, 1.0, 1.0));
104*2d1272b8SAndroid Build Coastguard Worker   }
105*2d1272b8SAndroid Build Coastguard Worker 
106*2d1272b8SAndroid Build Coastguard Worker   /* Case 3 boundary */
107*2d1272b8SAndroid Build Coastguard Worker   {
108*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.4, 1.0);
109*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, 0.0, 0.5);
110*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
111*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 2);
112*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
113*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (0.0, 0.8, 1.0));
114*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].first, 2.5/3));
115*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.8, 1.0, 1.0));
116*2d1272b8SAndroid Build Coastguard Worker   }
117*2d1272b8SAndroid Build Coastguard Worker 
118*2d1272b8SAndroid Build Coastguard Worker   /* Case 4 */
119*2d1272b8SAndroid Build Coastguard Worker   {
120*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.25, 1.0);
121*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, 0.0, 0.4);
122*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
123*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 2);
124*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
125*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (0.0, 0.625, 1.0));
126*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].first, 0.80));
127*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.625, 1.0, 1.0));
128*2d1272b8SAndroid Build Coastguard Worker   }
129*2d1272b8SAndroid Build Coastguard Worker 
130*2d1272b8SAndroid Build Coastguard Worker   /* Case 4 */
131*2d1272b8SAndroid Build Coastguard Worker   {
132*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.25, 0.3, 1.05);
133*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.2, 0.4);
134*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
135*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 2);
136*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
137*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[0].second, Triple (0.25, 0.5, 1.0)));
138*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].first, 2.6 / 3));
139*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].second, Triple (0.5, 1.0, 1.0)));
140*2d1272b8SAndroid Build Coastguard Worker   }
141*2d1272b8SAndroid Build Coastguard Worker 
142*2d1272b8SAndroid Build Coastguard Worker   /* Case 4 boundary */
143*2d1272b8SAndroid Build Coastguard Worker   {
144*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.25, 0.5, 1.0);
145*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.25, 0.5);
146*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
147*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
148*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
149*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (0.0, 1.0, 1.0));
150*2d1272b8SAndroid Build Coastguard Worker   }
151*2d1272b8SAndroid Build Coastguard Worker 
152*2d1272b8SAndroid Build Coastguard Worker   /* With gain */
153*2d1272b8SAndroid Build Coastguard Worker   /* Case 3a/1neg */
154*2d1272b8SAndroid Build Coastguard Worker   {
155*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.5, 1.0);
156*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.5, 1.0);
157*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
158*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 3);
159*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
160*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
161*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == -1.0);
162*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0, 1.0));
163*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].first == -1.0);
164*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (-1.0, -1.0, 0.0));
165*2d1272b8SAndroid Build Coastguard Worker   }
166*2d1272b8SAndroid Build Coastguard Worker 
167*2d1272b8SAndroid Build Coastguard Worker   {
168*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.5, 1.0);
169*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.5, 0.75);
170*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
171*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 3);
172*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
173*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
174*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == -0.5);
175*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0, 1.0));
176*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].first == -1.0);
177*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (-1.0, -1.0, 0.0));
178*2d1272b8SAndroid Build Coastguard Worker   }
179*2d1272b8SAndroid Build Coastguard Worker 
180*2d1272b8SAndroid Build Coastguard Worker   {
181*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.50, 1.0);
182*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.25, 0.8);
183*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
184*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 4);
185*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 0.5);
186*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
187*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == 0.5);
188*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].second, Triple (0.0, 0.454545, 0.909091)));
189*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[2].first, -0.1));
190*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[2].second, Triple (0.909091, 1.0, 1.0)));
191*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].first == -0.5);
192*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].second == Triple (-1.0, -1.0, 0.0));
193*2d1272b8SAndroid Build Coastguard Worker   }
194*2d1272b8SAndroid Build Coastguard Worker 
195*2d1272b8SAndroid Build Coastguard Worker   /* Case 3a/1neg */
196*2d1272b8SAndroid Build Coastguard Worker   {
197*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.5, 2.0);
198*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.2, 0.5, 0.8);
199*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
200*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 3);
201*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
202*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
203*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].first, -0.2));
204*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0, 1.0));
205*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[2].first, -0.6));
206*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (-1.0, -1.0, 0.0));
207*2d1272b8SAndroid Build Coastguard Worker   }
208*2d1272b8SAndroid Build Coastguard Worker 
209*2d1272b8SAndroid Build Coastguard Worker   /* Case 3a/1neg */
210*2d1272b8SAndroid Build Coastguard Worker   {
211*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.5, 2.0);
212*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.2, 0.5, 1.0);
213*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
214*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 3);
215*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
216*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
217*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].first, -1.0/3));
218*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0, 1.0));
219*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[2].first, -0.6));
220*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (-1.0, -1.0, 0.0));
221*2d1272b8SAndroid Build Coastguard Worker   }
222*2d1272b8SAndroid Build Coastguard Worker 
223*2d1272b8SAndroid Build Coastguard Worker   /* Case 3 */
224*2d1272b8SAndroid Build Coastguard Worker   {
225*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.5, 1.0);
226*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.25, 0.25, 0.75);
227*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
228*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 2);
229*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 0.5);
230*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
231*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == 0.5);
232*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 0.5, 1.0));
233*2d1272b8SAndroid Build Coastguard Worker   }
234*2d1272b8SAndroid Build Coastguard Worker 
235*2d1272b8SAndroid Build Coastguard Worker   /* Case 1neg */
236*2d1272b8SAndroid Build Coastguard Worker   {
237*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.5, 1.0);
238*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.25, 0.5);
239*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
240*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 3);
241*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 0.5);
242*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
243*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == 0.5);
244*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0, 1.0));
245*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].first == -0.5);
246*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (-1.0, -1.0, 0.0));
247*2d1272b8SAndroid Build Coastguard Worker   }
248*2d1272b8SAndroid Build Coastguard Worker 
249*2d1272b8SAndroid Build Coastguard Worker   /* Case 2neg */
250*2d1272b8SAndroid Build Coastguard Worker   {
251*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.05, 0.55, 1.0);
252*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.25, 0.5);
253*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
254*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 4);
255*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[0].first, 0.4));
256*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
257*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].first, 0.5));
258*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0, 1.0));
259*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[2].first, -0.4));
260*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (-1.0, -0.8, 0.0));
261*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[3].first, -0.4));
262*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].second == Triple (-1.0, -1.0, -0.8));
263*2d1272b8SAndroid Build Coastguard Worker   }
264*2d1272b8SAndroid Build Coastguard Worker 
265*2d1272b8SAndroid Build Coastguard Worker   /* Case 2neg, other side */
266*2d1272b8SAndroid Build Coastguard Worker   {
267*2d1272b8SAndroid Build Coastguard Worker     Triple tent (-1.0, -0.55, -0.05);
268*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-0.5, -0.25, 0.0);
269*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
270*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 4);
271*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[0].first, 0.4));
272*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
273*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[1].first, 0.5));
274*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (-1.0, -1.0, 0.0));
275*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[2].first, -0.4));
276*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (0.0, 0.8, 1.0));
277*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[3].first, -0.4));
278*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].second == Triple (0.8, 1.0, 1.0));
279*2d1272b8SAndroid Build Coastguard Worker   }
280*2d1272b8SAndroid Build Coastguard Worker 
281*2d1272b8SAndroid Build Coastguard Worker   /* Misc corner cases */
282*2d1272b8SAndroid Build Coastguard Worker   {
283*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.5, 0.5, 0.5);
284*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.5, 0.5, 0.5);
285*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
286*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
287*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
288*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
289*2d1272b8SAndroid Build Coastguard Worker   }
290*2d1272b8SAndroid Build Coastguard Worker 
291*2d1272b8SAndroid Build Coastguard Worker   {
292*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.3, 0.5, 0.7);
293*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.1, 0.5, 0.9);
294*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
295*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 5);
296*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
297*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
298*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == -1.0);
299*2d1272b8SAndroid Build Coastguard Worker     assert (approx(out[1].second, Triple (0.0, 0.5, 1.0)));
300*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].first == -1.0);
301*2d1272b8SAndroid Build Coastguard Worker     assert (approx(out[2].second, Triple (0.5, 1.0, 1.0)));
302*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].first == -1.0);
303*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[3].second, Triple (-1.0, -0.5, 0.0)));
304*2d1272b8SAndroid Build Coastguard Worker     assert (out[4].first == -1.0);
305*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[4].second, Triple (-1.0, -1.0, -0.5)));
306*2d1272b8SAndroid Build Coastguard Worker   }
307*2d1272b8SAndroid Build Coastguard Worker 
308*2d1272b8SAndroid Build Coastguard Worker   {
309*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.5, 0.5, 0.5);
310*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.25, 0.25, 0.5);
311*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
312*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
313*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
314*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (1.0, 1.0, 1.0));
315*2d1272b8SAndroid Build Coastguard Worker   }
316*2d1272b8SAndroid Build Coastguard Worker 
317*2d1272b8SAndroid Build Coastguard Worker   {
318*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.5, 0.5, 0.5);
319*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.25, 0.35, 0.5);
320*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
321*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
322*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
323*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (1.0, 1.0, 1.0));
324*2d1272b8SAndroid Build Coastguard Worker   }
325*2d1272b8SAndroid Build Coastguard Worker 
326*2d1272b8SAndroid Build Coastguard Worker   {
327*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.5, 0.5, 0.55);
328*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.25, 0.35, 0.5);
329*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
330*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
331*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
332*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (1.0, 1.0, 1.0));
333*2d1272b8SAndroid Build Coastguard Worker   }
334*2d1272b8SAndroid Build Coastguard Worker 
335*2d1272b8SAndroid Build Coastguard Worker   {
336*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.5, 0.5, 1.0);
337*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.5, 0.5, 1.0);
338*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
339*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 2);
340*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
341*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
342*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == -1.0);
343*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0, 1.0));
344*2d1272b8SAndroid Build Coastguard Worker   }
345*2d1272b8SAndroid Build Coastguard Worker 
346*2d1272b8SAndroid Build Coastguard Worker   {
347*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.25, 0.5, 1.0);
348*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.5, 0.5, 1.0);
349*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
350*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 2);
351*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
352*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
353*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == -1.0);
354*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0, 1.0));
355*2d1272b8SAndroid Build Coastguard Worker   }
356*2d1272b8SAndroid Build Coastguard Worker 
357*2d1272b8SAndroid Build Coastguard Worker   {
358*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.2, 1.0);
359*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.0, 0.5);
360*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
361*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 2);
362*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
363*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (0.0, 0.4, 1.0));
364*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == 0.625);
365*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.4, 1.0, 1.0));
366*2d1272b8SAndroid Build Coastguard Worker   }
367*2d1272b8SAndroid Build Coastguard Worker 
368*2d1272b8SAndroid Build Coastguard Worker 
369*2d1272b8SAndroid Build Coastguard Worker   {
370*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 0.5, 1.0);
371*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, 0.25, 1.0);
372*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
373*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 5);
374*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 0.5);
375*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
376*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == 0.5);
377*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 1.0/3, 2.0/3));
378*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].first == -0.5);
379*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (2.0/3, 1.0, 1.0));
380*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].first == -0.5);
381*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].second == Triple (-1.0, -0.2, 0.0));
382*2d1272b8SAndroid Build Coastguard Worker     assert (out[4].first == -0.5);
383*2d1272b8SAndroid Build Coastguard Worker     assert (out[4].second == Triple (-1.0, -1.0, -0.2));
384*2d1272b8SAndroid Build Coastguard Worker   }
385*2d1272b8SAndroid Build Coastguard Worker 
386*2d1272b8SAndroid Build Coastguard Worker   {
387*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.5, 0.5, 0.5);
388*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (0.0, 0.5, 1.0);
389*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
390*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 5);
391*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
392*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple ());
393*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].first == -1.0);
394*2d1272b8SAndroid Build Coastguard Worker     assert (out[1].second == Triple (0.0, 2/(double) (1 << 14), 1.0));
395*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].first == -1.0);
396*2d1272b8SAndroid Build Coastguard Worker     assert (out[2].second == Triple (2/(double) (1 << 14), 1.0, 1.0));
397*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].first == -1.0);
398*2d1272b8SAndroid Build Coastguard Worker     assert (out[3].second == Triple (-1.0, -2/(double) (1 << 14), 0.0));
399*2d1272b8SAndroid Build Coastguard Worker     assert (out[4].first == -1.0);
400*2d1272b8SAndroid Build Coastguard Worker     assert (out[4].second == Triple (-1.0, -1.0, -2/(double) (1 << 14)));
401*2d1272b8SAndroid Build Coastguard Worker   }
402*2d1272b8SAndroid Build Coastguard Worker 
403*2d1272b8SAndroid Build Coastguard Worker   {
404*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 1.0, 1.0);
405*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, -0.5, 1.0);
406*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, default_axis_distances);
407*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
408*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
409*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (1.0/3, 1.0, 1.0));
410*2d1272b8SAndroid Build Coastguard Worker   }
411*2d1272b8SAndroid Build Coastguard Worker 
412*2d1272b8SAndroid Build Coastguard Worker   {
413*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.0, 1.0, 1.0);
414*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, -0.5, 1.0);
415*2d1272b8SAndroid Build Coastguard Worker     TripleDistances axis_distances{2.0, 1.0};
416*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, axis_distances);
417*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
418*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
419*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].second == Triple (0.5, 1.0, 1.0));
420*2d1272b8SAndroid Build Coastguard Worker   }
421*2d1272b8SAndroid Build Coastguard Worker 
422*2d1272b8SAndroid Build Coastguard Worker   {
423*2d1272b8SAndroid Build Coastguard Worker     Triple tent (0.6, 0.7, 0.8);
424*2d1272b8SAndroid Build Coastguard Worker     Triple axis_range (-1.0, 0.2, 1.0);
425*2d1272b8SAndroid Build Coastguard Worker     TripleDistances axis_distances{1.0, 1.0};
426*2d1272b8SAndroid Build Coastguard Worker     rebase_tent_result_t out = rebase_tent (tent, axis_range, axis_distances);
427*2d1272b8SAndroid Build Coastguard Worker     assert (out.length == 1);
428*2d1272b8SAndroid Build Coastguard Worker     assert (out[0].first == 1.0);
429*2d1272b8SAndroid Build Coastguard Worker     assert (approx (out[0].second, Triple (0.5, 0.625, 0.75)));
430*2d1272b8SAndroid Build Coastguard Worker   }
431*2d1272b8SAndroid Build Coastguard Worker }
432