Home | History | Annotate | Download | only in math
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 /**
     18  * @author Elena Semukhina
     19  */
     20 
     21 package org.apache.harmony.tests.java.math;
     22 
     23 import junit.framework.TestCase;
     24 import java.math.BigInteger;
     25 
     26 /**
     27  * Class:  java.math.BigInteger
     28  * Method: add
     29  */
     30 public class BigIntegerAddTest extends TestCase {
     31     /**
     32      * Add two positive numbers of the same length
     33      */
     34     public void testCase1() {
     35         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
     36         byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
     37         int aSign = 1;
     38         int bSign = 1;
     39         byte rBytes[] = {11, 22, 33, 44, 55, 66, 77, 11, 22, 33};
     40         BigInteger aNumber = new BigInteger(aSign, aBytes);
     41         BigInteger bNumber = new BigInteger(bSign, bBytes);
     42         BigInteger result = aNumber.add(bNumber);
     43         byte resBytes[] = new byte[rBytes.length];
     44         resBytes = result.toByteArray();
     45         for(int i = 0; i < resBytes.length; i++) {
     46             assertTrue(resBytes[i] == rBytes[i]);
     47         }
     48         assertEquals("incorrect sign", 1, result.signum());
     49     }
     50 
     51     /**
     52      * Add two negative numbers of the same length
     53      */
     54     public void testCase2() {
     55         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
     56         byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
     57         int aSign = -1;
     58         int bSign = -1;
     59         byte rBytes[] = {-12, -23, -34, -45, -56, -67, -78, -12, -23, -33};
     60         BigInteger aNumber = new BigInteger(aSign, aBytes);
     61         BigInteger bNumber = new BigInteger(bSign, bBytes);
     62         BigInteger result = aNumber.add(bNumber);
     63         byte resBytes[] = new byte[rBytes.length];
     64         resBytes = result.toByteArray();
     65         for(int i = 0; i < resBytes.length; i++) {
     66             assertTrue(resBytes[i] == rBytes[i]);
     67         }
     68         assertEquals("incorrect sign", -1, result.signum());
     69     }
     70 
     71     /**
     72      * Add two numbers of the same length.
     73      * The first one is positive and the second is negative.
     74      * The first one is greater in absolute value.
     75      */
     76     public void testCase3() {
     77         byte aBytes[] = {3, 4, 5, 6, 7, 8, 9};
     78         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
     79         byte rBytes[] = {2, 2, 2, 2, 2, 2, 2};
     80         int aSign = 1;
     81         int bSign = -1;
     82         BigInteger aNumber = new BigInteger(aSign, aBytes);
     83         BigInteger bNumber = new BigInteger(bSign, bBytes);
     84         BigInteger result = aNumber.add(bNumber);
     85         byte resBytes[] = new byte[rBytes.length];
     86         resBytes = result.toByteArray();
     87         for(int i = 0; i < resBytes.length; i++) {
     88             assertTrue(resBytes[i] == rBytes[i]);
     89         }
     90         assertEquals("incorrect sign", 1, result.signum());
     91     }
     92 
     93     /**
     94      * Add two numbers of the same length.
     95      * The first one is negative and the second is positive.
     96      * The first one is greater in absolute value.
     97      */
     98     public void testCase4() {
     99         byte aBytes[] = {3, 4, 5, 6, 7, 8, 9};
    100         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
    101         byte rBytes[] = {-3, -3, -3, -3, -3, -3, -2};
    102         int aSign = -1;
    103         int bSign = 1;
    104         BigInteger aNumber = new BigInteger(aSign, aBytes);
    105         BigInteger bNumber = new BigInteger(bSign, bBytes);
    106         BigInteger result = aNumber.add(bNumber);
    107         byte resBytes[] = new byte[rBytes.length];
    108         resBytes = result.toByteArray();
    109         for(int i = 0; i < resBytes.length; i++) {
    110             assertTrue(resBytes[i] == rBytes[i]);
    111         }
    112         assertEquals("incorrect sign", -1, result.signum());
    113     }
    114 
    115     /**
    116      * Add two numbers of the same length.
    117      * The first is positive and the second is negative.
    118      * The first is less in absolute value.
    119      */
    120     public void testCase5() {
    121         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
    122         byte bBytes[] = {3, 4, 5, 6, 7, 8, 9};
    123         byte rBytes[] = {-3, -3, -3, -3, -3, -3, -2};
    124         int aSign = 1;
    125         int bSign = -1;
    126         BigInteger aNumber = new BigInteger(aSign, aBytes);
    127         BigInteger bNumber = new BigInteger(bSign, bBytes);
    128         BigInteger result = aNumber.add(bNumber);
    129         byte resBytes[] = new byte[rBytes.length];
    130         resBytes = result.toByteArray();
    131         for(int i = 0; i < resBytes.length; i++) {
    132             assertTrue(resBytes[i] == rBytes[i]);
    133         }
    134         assertEquals("incorrect sign", -1, result.signum());
    135     }
    136 
    137     /**
    138      * Add two numbers of the same length.
    139      * The first one is negative and the second is positive.
    140      * The first one is less in absolute value.
    141      */
    142     public void testCase6() {
    143         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
    144         byte bBytes[] = {3, 4, 5, 6, 7, 8, 9};
    145         byte rBytes[] = {2, 2, 2, 2, 2, 2, 2};
    146         int aSign = -1;
    147         int bSign = 1;
    148         BigInteger aNumber = new BigInteger(aSign, aBytes);
    149         BigInteger bNumber = new BigInteger(bSign, bBytes);
    150         BigInteger result = aNumber.add(bNumber);
    151         byte resBytes[] = new byte[rBytes.length];
    152         resBytes = result.toByteArray();
    153         for(int i = 0; i < resBytes.length; i++) {
    154             assertTrue(resBytes[i] == rBytes[i]);
    155         }
    156         assertEquals("incorrect sign", 1, result.signum());
    157     }
    158 
    159     /**
    160      * Add two positive numbers of different length.
    161      * The first is longer.
    162      */
    163     public void testCase7() {
    164         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
    165         byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
    166         int aSign = 1;
    167         int bSign = 1;
    168         byte rBytes[] = {1, 2, 3, 4, 15, 26, 37, 41, 52, 63, 74, 15, 26, 37};
    169         BigInteger aNumber = new BigInteger(aSign, aBytes);
    170         BigInteger bNumber = new BigInteger(bSign, bBytes);
    171         BigInteger result = aNumber.add(bNumber);
    172         byte resBytes[] = new byte[rBytes.length];
    173         resBytes = result.toByteArray();
    174         for(int i = 0; i < resBytes.length; i++) {
    175             assertTrue(resBytes[i] == rBytes[i]);
    176         }
    177         assertEquals("incorrect sign", 1, result.signum());
    178     }
    179 
    180     /**
    181      * Add two positive numbers of different length.
    182      * The second is longer.
    183      */
    184     public void testCase8() {
    185         byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
    186         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
    187         byte rBytes[] = {1, 2, 3, 4, 15, 26, 37, 41, 52, 63, 74, 15, 26, 37};
    188         BigInteger aNumber = new BigInteger(aBytes);
    189         BigInteger bNumber = new BigInteger(bBytes);
    190         BigInteger result = aNumber.add(bNumber);
    191         byte resBytes[] = new byte[rBytes.length];
    192         resBytes = result.toByteArray();
    193         for(int i = 0; i < resBytes.length; i++) {
    194             assertTrue(resBytes[i] == rBytes[i]);
    195         }
    196         assertEquals("incorrect sign", 1, result.signum());
    197     }
    198 
    199     /**
    200      * Add two negative numbers of different length.
    201      * The first is longer.
    202      */
    203     public void testCase9() {
    204         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
    205         byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
    206         int aSign = -1;
    207         int bSign = -1;
    208         byte rBytes[] = {-2, -3, -4, -5, -16, -27, -38, -42, -53, -64, -75, -16, -27, -37};
    209         BigInteger aNumber = new BigInteger(aSign, aBytes);
    210         BigInteger bNumber = new BigInteger(bSign, bBytes);
    211         BigInteger result = aNumber.add(bNumber);
    212         byte resBytes[] = new byte[rBytes.length];
    213         resBytes = result.toByteArray();
    214         for(int i = 0; i < resBytes.length; i++) {
    215             assertTrue(resBytes[i] == rBytes[i]);
    216         }
    217         assertEquals("incorrect sign", -1, result.signum());
    218     }
    219 
    220     /**
    221      * Add two negative numbers of different length.
    222      * The second is longer.
    223      */
    224     public void testCase10() {
    225         byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
    226         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
    227         int aSign = -1;
    228         int bSign = -1;
    229         byte rBytes[] = {-2, -3, -4, -5, -16, -27, -38, -42, -53, -64, -75, -16, -27, -37};
    230         BigInteger aNumber = new BigInteger(aSign, aBytes);
    231         BigInteger bNumber = new BigInteger(bSign, bBytes);
    232         BigInteger result = aNumber.add(bNumber);
    233         byte resBytes[] = new byte[rBytes.length];
    234         resBytes = result.toByteArray();
    235         for(int i = 0; i < resBytes.length; i++) {
    236             assertTrue(resBytes[i] == rBytes[i]);
    237         }
    238         assertEquals("incorrect sign", -1, result.signum());
    239     }
    240 
    241     /**
    242      * Add two numbers of different length and sign.
    243      * The first is positive.
    244      * The first is longer.
    245      */
    246     public void testCase11() {
    247         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
    248         byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
    249         int aSign = 1;
    250         int bSign = -1;
    251         byte rBytes[] = {1, 2, 3, 3, -6, -15, -24, -40, -49, -58, -67, -6, -15, -23};
    252         BigInteger aNumber = new BigInteger(aSign, aBytes);
    253         BigInteger bNumber = new BigInteger(bSign, bBytes);
    254         BigInteger result = aNumber.add(bNumber);
    255         byte resBytes[] = new byte[rBytes.length];
    256         resBytes = result.toByteArray();
    257         for(int i = 0; i < resBytes.length; i++) {
    258             assertTrue(resBytes[i] == rBytes[i]);
    259         }
    260         assertEquals("incorrect sign", 1, result.signum());
    261     }
    262 
    263     /**
    264      * Add two numbers of different length and sign.
    265      * The first is positive.
    266      * The second is longer.
    267      */
    268     public void testCase12() {
    269         byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
    270         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
    271         int aSign = 1;
    272         int bSign = -1;
    273         byte rBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
    274         BigInteger aNumber = new BigInteger(aSign, aBytes);
    275         BigInteger bNumber = new BigInteger(bSign, bBytes);
    276         BigInteger result = aNumber.add(bNumber);
    277         byte resBytes[] = new byte[rBytes.length];
    278         resBytes = result.toByteArray();
    279         for(int i = 0; i < resBytes.length; i++) {
    280             assertTrue(resBytes[i] == rBytes[i]);
    281         }
    282         assertEquals("incorrect sign", -1, result.signum());
    283     }
    284 
    285     /**
    286      * Add two numbers of different length and sign.
    287      * The first is negative.
    288      * The first is longer.
    289      */
    290     public void testCase13() {
    291         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
    292         byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
    293         int aSign = -1;
    294         int bSign = 1;
    295         byte rBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
    296         BigInteger aNumber = new BigInteger(aSign, aBytes);
    297         BigInteger bNumber = new BigInteger(bSign, bBytes);
    298         BigInteger result = aNumber.add(bNumber);
    299         byte resBytes[] = new byte[rBytes.length];
    300         resBytes = result.toByteArray();
    301         for(int i = 0; i < resBytes.length; i++) {
    302             assertTrue(resBytes[i] == rBytes[i]);
    303         }
    304         assertEquals("incorrect sign", -1, result.signum());
    305     }
    306 
    307     /**
    308      * Add two numbers of different length and sign.
    309      * The first is negative.
    310      * The second is longer.
    311      */
    312     public void testCase14() {
    313         byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
    314         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
    315         int aSign = -1;
    316         int bSign = 1;
    317         byte rBytes[] = {1, 2, 3, 3, -6, -15, -24, -40, -49, -58, -67, -6, -15, -23};
    318         BigInteger aNumber = new BigInteger(aSign, aBytes);
    319         BigInteger bNumber = new BigInteger(bSign, bBytes);
    320         BigInteger result = aNumber.add(bNumber);
    321         byte resBytes[] = new byte[rBytes.length];
    322         resBytes = result.toByteArray();
    323         for(int i = 0; i < resBytes.length; i++) {
    324             assertTrue(resBytes[i] == rBytes[i]);
    325         }
    326         assertEquals("incorrect sign", 1, result.signum());
    327     }
    328 
    329     /**
    330      * Add two equal numbers of different signs
    331      */
    332     public void testCase15() {
    333         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
    334         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
    335         byte rBytes[] = {0};
    336         int aSign = -1;
    337         int bSign = 1;
    338         BigInteger aNumber = new BigInteger(aSign, aBytes);
    339         BigInteger bNumber = new BigInteger(bSign, bBytes);
    340         BigInteger result = aNumber.add(bNumber);
    341         byte resBytes[] = new byte[rBytes.length];
    342         for(int i = 0; i < resBytes.length; i++) {
    343             assertTrue(resBytes[i] == rBytes[i]);
    344         }
    345         assertEquals("incorrect sign", 0, result.signum());
    346     }
    347 
    348     /**
    349      * Add zero to a number
    350      */
    351     public void testCase16() {
    352         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
    353         byte bBytes[] = {0};
    354         byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
    355         int aSign = 1;
    356         int bSign = 1;
    357         BigInteger aNumber = new BigInteger(aSign, aBytes);
    358         BigInteger bNumber = new BigInteger(bSign, bBytes);
    359         BigInteger result = aNumber.add(bNumber);
    360         byte resBytes[] = new byte[rBytes.length];
    361         resBytes = result.toByteArray();
    362         for(int i = 0; i < resBytes.length; i++) {
    363             assertTrue(resBytes[i] == rBytes[i]);
    364         }
    365         assertEquals("incorrect sign", 1, result.signum());
    366     }
    367 
    368     /**
    369      * Add a number to zero
    370      */
    371     public void testCase17() {
    372         byte aBytes[] = {0};
    373         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
    374         byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
    375         int aSign = 1;
    376         int bSign = 1;
    377         BigInteger aNumber = new BigInteger(aSign, aBytes);
    378         BigInteger bNumber = new BigInteger(bSign, bBytes);
    379         BigInteger result = aNumber.add(bNumber);
    380         byte resBytes[] = new byte[rBytes.length];
    381         resBytes = result.toByteArray();
    382         for(int i = 0; i < resBytes.length; i++) {
    383             assertTrue(resBytes[i] == rBytes[i]);
    384         }
    385         assertEquals("incorrect sign", 1, result.signum());
    386     }
    387 
    388     /**
    389      * Add zero to zero
    390      */
    391     public void testCase18() {
    392         byte aBytes[] = {0};
    393         byte bBytes[] = {0};
    394         byte rBytes[] = {0};
    395         int aSign = 1;
    396         int bSign = 1;
    397         BigInteger aNumber = new BigInteger(aSign, aBytes);
    398         BigInteger bNumber = new BigInteger(bSign, bBytes);
    399         BigInteger result = aNumber.add(bNumber);
    400         byte resBytes[] = new byte[rBytes.length];
    401         resBytes = result.toByteArray();
    402         for(int i = 0; i < resBytes.length; i++) {
    403             assertTrue(resBytes[i] == rBytes[i]);
    404         }
    405         assertEquals("incorrect sign", 0, result.signum());
    406     }
    407 
    408     /**
    409      * Add ZERO to a number
    410      */
    411     public void testCase19() {
    412         byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
    413         byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
    414         int aSign = 1;
    415         BigInteger aNumber = new BigInteger(aSign, aBytes);
    416         BigInteger bNumber = BigInteger.ZERO;
    417         BigInteger result = aNumber.add(bNumber);
    418         byte resBytes[] = new byte[rBytes.length];
    419         resBytes = result.toByteArray();
    420         for(int i = 0; i < resBytes.length; i++) {
    421             assertTrue(resBytes[i] == rBytes[i]);
    422         }
    423         assertEquals("incorrect sign", 1, result.signum());
    424     }
    425 
    426     /**
    427      * Add a number to zero
    428      */
    429     public void testCase20() {
    430         byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
    431         byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
    432         int bSign = 1;
    433         BigInteger aNumber = BigInteger.ZERO;
    434         BigInteger bNumber = new BigInteger(bSign, bBytes);
    435         BigInteger result = aNumber.add(bNumber);
    436         byte resBytes[] = new byte[rBytes.length];
    437         resBytes = result.toByteArray();
    438         for(int i = 0; i < resBytes.length; i++) {
    439             assertTrue(resBytes[i] == rBytes[i]);
    440         }
    441         assertEquals("incorrect sign", 1, result.signum());
    442     }
    443 
    444     /**
    445      * Add ZERO to ZERO
    446      */
    447     public void testCase21() {
    448         byte rBytes[] = {0};
    449         BigInteger aNumber = BigInteger.ZERO;
    450         BigInteger bNumber = BigInteger.ZERO;
    451         BigInteger result = aNumber.add(bNumber);
    452         byte resBytes[] = new byte[rBytes.length];
    453         resBytes = result.toByteArray();
    454         for(int i = 0; i < resBytes.length; i++) {
    455             assertTrue(resBytes[i] == rBytes[i]);
    456         }
    457         assertEquals("incorrect sign", 0, result.signum());
    458     }
    459 
    460     /**
    461      * Add ONE to ONE
    462      */
    463     public void testCase22() {
    464         byte rBytes[] = {2};
    465         BigInteger aNumber = BigInteger.ONE;
    466         BigInteger bNumber = BigInteger.ONE;
    467         BigInteger result = aNumber.add(bNumber);
    468         byte resBytes[] = new byte[rBytes.length];
    469         resBytes = result.toByteArray();
    470         for(int i = 0; i < resBytes.length; i++) {
    471             assertTrue(resBytes[i] == rBytes[i]);
    472         }
    473         assertEquals("incorrect sign", 1, result.signum());
    474     }
    475 
    476     /**
    477      * Add two numbers so that carry is 1
    478      */
    479     public void testCase23() {
    480         byte aBytes[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
    481         byte bBytes[] = {-1, -1, -1, -1, -1, -1, -1, -1};
    482         int aSign = 1;
    483         int bSign = 1;
    484         byte rBytes[] = {1, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -2};
    485         BigInteger aNumber = new BigInteger(aSign, aBytes);
    486         BigInteger bNumber = new BigInteger(bSign, bBytes);
    487         BigInteger result = aNumber.add(bNumber);
    488         byte resBytes[] = new byte[rBytes.length];
    489         resBytes = result.toByteArray();
    490         for(int i = 0; i < resBytes.length; i++) {
    491             assertTrue(resBytes[i] == rBytes[i]);
    492         }
    493         assertEquals("incorrect sign", 1, result.signum());
    494     }
    495 }
    496