]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/blobdiff - tests/spec/tests.js
Add test for Beetlecoin
[perso/Immae/Projets/Cryptomonnaies/BIP39.git] / tests / spec / tests.js
index 998809a8c0ccc4b96f8b76334e9588b97fb1259c..80add739b978ad652968fcd1080c0fe17306c7bc 100644 (file)
@@ -30,9 +30,10 @@ var until = webdriver.until;
 var newDriver = null;
 var driver = null;
 // Delays in ms
-var generateDelay = 1000;
+var generateDelay = 1500;
 var feedbackDelay = 500;
 var entropyFeedbackDelay = 500;
+var bip38delay = 15000;
 
 // url uses file:// scheme
 var path = require('path')
@@ -422,6 +423,13 @@ it('Allows selection of dogecoin', function(done) {
     };
     testNetwork(done, params);
 });
+it('Allows selection of denarius', function(done) {
+    var params = {
+        selectText: "DNR - Denarius",
+        firstAddress: "DFdFMVUMzU9xX88EywXvAGwjiwpxyh9vKb",
+    };
+    testNetwork(done, params);
+});
 it('Allows selection of shadowcash', function(done) {
     var params = {
         selectText: "SDC - ShadowCash",
@@ -492,6 +500,13 @@ it('Allows selection of game', function(done) {
     };
     testNetwork(done, params);
 });
+it('Allows selection of komodo', function(done) {
+    var params = {
+        selectText: "KMD - Komodo",
+        firstAddress: "RMPPzJwAjPVZZAwJvXivHJGGjdCx6WBD2t",
+    };
+    testNetwork(done, params);
+});
 it('Allows selection of namecoin', function(done) {
     var params = {
         selectText: "NMC - Namecoin",
@@ -499,6 +514,13 @@ it('Allows selection of namecoin', function(done) {
     };
     testNetwork(done, params);
 });
+it('Allows selection of onixcoin', function(done) {
+    var params = {
+        selectText: "ONX - Onixcoin",
+        firstAddress: "XGwMqddeKjT3ddgX73QokjVbCL3aK6Yxfk",
+    };
+    testNetwork(done, params);
+});
 it('Allows selection of peercoin', function(done) {
     var params = {
         selectText: "PPC - Peercoin",
@@ -580,7 +602,7 @@ it('Allows selection of nubits', function(done) {
 it('Allows selection of bitcoin gold', function(done) {
     var params = {
         selectText: "BTG - Bitcoin Gold",
-        firstAddress: "GWYxuwSqANWGV3WT7Gpr6HE91euYXBqtwQ",
+        firstAddress: "GdDqug4WUsn5syNbSTHatNn4XnuwZtzedx",
     };
     testNetwork(done, params);
 });
@@ -591,6 +613,34 @@ it('Allows selection of monacoin', function(done) {
     };
     testNetwork(done, params);
 });
+it('Allows selection of AXE', function(done) {
+    var params = {
+        selectText: "AXE - Axe",
+        firstAddress: "XQ4HLxUVS3egk5ff1o9e2vJFJKSSsUH3B7",
+    };
+    testNetwork(done, params);
+});
+it('Allows selection of BlackCoin', function(done) {
+    var params = {
+        selectText: "BLK - BlackCoin",
+        firstAddress: "B5MznAKwj7uQ42vDz3w4onhBXPcqhTwJ9z",
+    };
+    testNetwork(done, params);
+});
+it('Allows selection of Neblio', function(done) {
+    var params = {
+        selectText: "NEBL - Neblio",
+        firstAddress: "NefkeEEvhusbHMmTRrxx7H9wFnUXd8qQsE",
+    };
+    testNetwork(done, params);
+});
+it('Allows selection of Beetlecoin', function(done) {
+    var params = {
+        selectText: "BEET - Beetlecoin",
+        firstAddress: "BVmtbEsGrjpknprmpHFq26z4kYHJUFHE71",
+    };
+    testNetwork(done, params);
+});
 
 // BIP39 seed is set from phrase
 it('Sets the bip39 seed from the prhase', function(done) {
@@ -919,13 +969,13 @@ it('Can generate more rows in the table', function(done) {
 
 // A custom number of additional addresses can be generated
 it('Can generate more rows in the table', function(done) {
-    driver.findElement(By.css('.rows-to-add'))
-        .clear();
-    driver.findElement(By.css('.rows-to-add'))
-        .sendKeys('1');
     driver.findElement(By.css('.phrase'))
         .sendKeys('abandon abandon ability');
     driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.rows-to-add'))
+            .clear();
+        driver.findElement(By.css('.rows-to-add'))
+            .sendKeys('1');
         driver.findElement(By.css('.more'))
             .click();
         driver.sleep(generateDelay).then(function() {
@@ -2145,10 +2195,11 @@ it('Can change details while old addresses are still being generated', function(
     driver.findElement(By.css('.phrase'))
         .sendKeys("abandon abandon ability");
     driver.sleep(generateDelay).then(function() {
-        // generate more addresses
-        driver.findElement(By.css('.more'))
-            .click();
         // change tabs which should cancel the previous generating
+        driver.findElement(By.css('.rows-to-add'))
+            .clear();
+        driver.findElement(By.css('.rows-to-add'))
+            .sendKeys('20');
         driver.findElement(By.css('#bip32-tab a'))
             .click()
         driver.sleep(generateDelay).then(function() {
@@ -2161,7 +2212,7 @@ it('Can change details while old addresses are still being generated', function(
                 });
         });
     });
-});
+}, generateDelay + 5000);
 
 // Github issue 49
 // padding for binary should give length with multiple of 256
@@ -2473,11 +2524,11 @@ it('Shows error for hardened addresses with xpub root key', function(done) {
     });
 });
 
-// Litecoin uses xprv by default, and can optionally be set to ltpv
+// Litecoin uses ltub by default, and can optionally be set to xprv
 // github issue 96
 // https://github.com/iancoleman/bip39/issues/96
 // Issue with extended keys on Litecoin
-it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) {
+it('Uses ltub by default for litecoin, but can be set to xprv', function(done) {
     driver.findElement(By.css('.phrase'))
         .sendKeys("abandon abandon ability");
     selectNetwork("LTC - Litecoin");
@@ -2486,17 +2537,17 @@ it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) {
         driver.findElement(By.css('.root-key'))
             .getAttribute("value")
             .then(function(rootKey) {
-                expect(rootKey).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
+                expect(rootKey).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU");
                 // set litecoin to use ltub
                 driver.executeScript(function() {
-                    $(".litecoin-use-ltub").prop("checked", true);
+                    $(".litecoin-use-ltub").prop("checked", false);
                     $(".litecoin-use-ltub").trigger("change");
                 });
                 driver.sleep(generateDelay).then(function() {
                     driver.findElement(By.css('.root-key'))
                         .getAttribute("value")
                         .then(function(rootKey) {
-                            expect(rootKey).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU");
+                            expect(rootKey).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
                             done();
                         });
                 })
@@ -2504,31 +2555,6 @@ it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) {
     });
 });
 
-// BIP32 tab can use P2WPKH Nested In P2SH
-// github issue 91 part 2
-// https://github.com/iancoleman/bip39/issues/91
-// generate new addresses from xpub?
-it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) {
-    // use p2wpkh addresses
-    driver.executeScript(function() {
-        $(".p2wpkh-nested-in-p2sh").prop("checked", true);
-    });
-    // use bip32 tab
-    driver.findElement(By.css('#bip32-tab a'))
-        .click()
-    // use testnet
-    selectNetwork("BTC - Bitcoin Testnet");
-    // Set root xpub to BIP49 official test vector account 0
-    driver.findElement(By.css('.root-key'))
-        .sendKeys("tpubDD7tXK8KeQ3YY83yWq755fHY2JW8Ha8Q765tknUM5rSvjPcGWfUppDFMpQ1ScziKfW3ZNtZvAD7M3u7bSs7HofjTD3KP3YxPK7X6hwV8Rk2");
-    driver.sleep(generateDelay).then(function() {
-        getFirstAddress(function(address) {
-            expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2");
-            done();
-        });
-    });
-});
-
 // github issue 99
 // https://github.com/iancoleman/bip39/issues/99#issuecomment-327094159
 // "warn me emphatically when they have detected invalid input" to the entropy field
@@ -2577,4 +2603,369 @@ it('Can use bitpay format for bitcoin cash addresses', function(done) {
     });
 });
 
+// End of tests ported from old suit, so no more comments above each test now
+
+it('Can generate more addresses from a custom index', function(done) {
+    var expectedIndexes = [
+        0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
+        40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
+    ];
+    driver.findElement(By.css('.phrase'))
+        .sendKeys("abandon abandon ability");
+    driver.sleep(generateDelay).then(function() {
+        // Set start of next lot of rows to be from index 40
+        // which means indexes 20-39 will not be in the table.
+        driver.findElement(By.css('.more-rows-start-index'))
+            .sendKeys("40");
+        driver.findElement(By.css('.more'))
+            .click();
+        driver.sleep(generateDelay).then(function() {
+            // Check actual indexes in the table match the expected pattern
+            driver.findElements(By.css(".index"))
+                .then(function(els) {
+                    expect(els.length).toBe(expectedIndexes.length);
+                    var testRowAtIndex = function(i) {
+                        if (i >= expectedIndexes.length) {
+                            done();
+                        }
+                        else {
+                            els[i].getText()
+                                .then(function(actualPath) {
+                                    var noHardened = actualPath.replace(/'/g, "");
+                                    var pathBits = noHardened.split("/")
+                                    var lastBit = pathBits[pathBits.length-1];
+                                    var actualIndex = parseInt(lastBit);
+                                    var expectedIndex = expectedIndexes[i];
+                                    expect(actualIndex).toBe(expectedIndex);
+                                    testRowAtIndex(i+1);
+                                });
+                        }
+                    }
+                    testRowAtIndex(0);
+                });
+        });
+    });
+});
+
+it('Can generate BIP141 addresses with P2WPKH-in-P2SH semanitcs', function(done) {
+    // Sourced from BIP49 official test specs
+    driver.findElement(By.css('#bip141-tab a'))
+        .click();
+    driver.findElement(By.css('.bip141-path'))
+        .clear();
+    driver.findElement(By.css('.bip141-path'))
+        .sendKeys("m/49'/1'/0'/0");
+    selectNetwork("BTC - Bitcoin Testnet");
+    driver.findElement(By.css(".phrase"))
+        .sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about");
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2");
+            done();
+        });
+    });
+});
+
+it('Can generate BIP141 addresses with P2WPKH semanitcs', function(done) {
+    // This result tested against bitcoinjs-lib test spec for segwit address
+    // using the first private key of this mnemonic and default path m/0
+    // https://github.com/bitcoinjs/bitcoinjs-lib/blob/9c8503cab0c6c30a95127042703bc18e8d28c76d/test/integration/addresses.js#L50
+    // so whilst not directly comparable, substituting the private key produces
+    // identical results between this tool and the bitcoinjs-lib test.
+    // Private key generated is:
+    // L3L8Nu9whawPBNLGtFqDhKut9DKKfG3CQoysupT7BimqVCZsLFNP
+    driver.findElement(By.css('#bip141-tab a'))
+        .click();
+    // Choose P2WPKH
+    driver.executeScript(function() {
+        $(".bip141-semantics option[selected]").removeAttr("selected");
+        $(".bip141-semantics option").filter(function(i,e) {
+            return $(e).html() == "P2WPKH";
+        }).prop("selected", true);
+        $(".bip141-semantics").trigger("change");
+    });
+    driver.findElement(By.css(".phrase"))
+        .sendKeys("abandon abandon ability");
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1qfwu6a5a3evygrk8zvdxxvz4547lmpyx5vsfxe9");
+            done();
+        });
+    });
+});
+
+it('Shows the entropy used by the PRNG when clicking generate', function(done) {
+    driver.findElement(By.css('.generate')).click();
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.entropy'))
+            .getAttribute("value")
+            .then(function(entropy) {
+                expect(entropy).not.toBe("");
+                done();
+            });
+    });
+});
+
+it('Shows the index of each word in the mnemonic', function(done) {
+    driver.findElement(By.css('.phrase'))
+        .sendKeys("abandon abandon ability");
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.use-entropy'))
+            .click();
+        driver.findElement(By.css('.word-indexes'))
+            .getText()
+            .then(function(indexes) {
+                expect(indexes).toBe("0, 0, 1");
+                done();
+            });
+    });
+});
+
+it('Shows the derivation path for bip84 tab', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('#bip84 .path'))
+            .getAttribute("value")
+            .then(function(path) {
+                expect(path).toBe("m/84'/0'/0'/0");
+                done();
+            })
+    });
+});
+
+it('Shows the extended private key for bip84 tab', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.extended-priv-key'))
+            .getAttribute("value")
+            .then(function(path) {
+                expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP");
+                done();
+            })
+    });
+});
+
+it('Shows the extended public key for bip84 tab', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.extended-pub-key'))
+            .getAttribute("value")
+            .then(function(path) {
+                expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx");
+                done();
+            })
+    });
+});
+
+it('Changes the address list if bip84 account is changed', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('#bip84 .account'))
+        .sendKeys('1');
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662");
+            done();
+        });
+    });
+});
+
+it('Changes the address list if bip84 change is changed', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('#bip84 .change'))
+        .sendKeys('1');
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2");
+            done();
+        });
+    });
+});
+
+it('Passes the official BIP84 test spec for rootpriv', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css(".root-key"))
+        .getAttribute("value")
+        .then(function(rootKey) {
+            expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5");
+            done();
+        })
+    });
+});
+
+it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css("#bip84 .account-xprv"))
+        .getAttribute("value")
+        .then(function(rootKey) {
+            expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE");
+            done();
+        })
+    });
+});
+
+it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css("#bip84 .account-xpub"))
+        .getAttribute("value")
+        .then(function(rootKey) {
+            expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs");
+            done();
+        })
+    });
+});
+
+it('Passes the official BIP84 test spec for account 0 first address', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu");
+            done();
+        });
+    });
+});
+
+it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.findElement(By.css('#bip84 .change'))
+        .sendKeys('1');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el");
+            done();
+        });
+    });
+});
+
+it('Can display the table as csv', function(done) {
+    var headings = "path,address,public key,private key";
+    var row1 = "m/44'/0'/0'/0/0,1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug,033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3,L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE";
+    var row20 = "m/44'/0'/0'/0/19,1KhBy28XLAciXnnRvm71PvQJaETyrxGV55,02b4b3e396434d8cdd20c03ac4aaa07387784d5d867b75987f516f5705ee68cb3a,L4GrDrjReMsCAu5DkLXn79jSb95qR7Zfx7eshybCQZ1qL32MXJab";
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.csv'))
+            .getAttribute("value")
+            .then(function(csv) {
+                expect(csv).toContain(headings);
+                expect(csv).toContain(row1);
+                expect(csv).toContain(row20);
+                done();
+            });
+    });
+});
+
+it('LeftPads ethereum keys that are less than 32 bytes', function(done) {
+    // see https://github.com/iancoleman/bip39/issues/155
+    selectNetwork("ETH - Ethereum");
+    driver.findElement(By.css('#bip32-tab a'))
+        .click()
+    driver.findElement(By.css('#bip32-path'))
+        .clear();
+    driver.findElement(By.css('#bip32-path'))
+        .sendKeys("m/44'/60'/0'");
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('scout sort custom elite radar rare vivid thing trophy gesture cover snake change narrow kite list nation sustain buffalo erode open balance system young');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("0x8943E785B4a5714FC87a3aFAad1eB1FeB602B118");
+            done();
+        });
+    });
+});
+
+it('Can encrypt private keys using BIP38', function(done) {
+    // see https://github.com/iancoleman/bip39/issues/140
+    driver.executeScript(function() {
+        $(".use-bip38").prop("checked", true);
+    });
+    driver.findElement(By.css('.bip38-password'))
+        .sendKeys('bip38password');
+    driver.findElement(By.css('.rows-to-add'))
+        .clear();
+    driver.findElement(By.css('.rows-to-add'))
+        .sendKeys('1');
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(bip38delay).then(function() {
+        // address
+        getFirstRowValue(function(address) {
+            expect(address).toBe("1NCvSdumA3ngMM9c4aqU56AM6rqXddfuXB");
+            // pubkey
+            getFirstRowValue(function(pubkey) {
+                expect(pubkey).toBe("043f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3884a74447ea901729b1e73a999b7520e7cb55b4120e6432c64153ccab8a848e1");
+                // privkey
+                getFirstRowValue(function(privkey) {
+                    expect(privkey).toBe("6PRNRiFnj1RoR3sXhymdCvoZCgnUHQpfupNdKkFbWJkwWQEKesWt1EDMDM");
+                    done();
+                }, ".privkey");
+            }, ".pubkey");
+        }, ".address");
+    });
+}, bip38delay + 5000);
+
+it('Shows the checksum for the entropy', function(done) {
+    driver.findElement(By.css('.use-entropy'))
+        .click();
+    driver.findElement(By.css('.entropy'))
+        .sendKeys("00000000000000000000000000000000");
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.checksum'))
+            .getText()
+            .then(function(text) {
+                expect(text).toBe("1");
+                done();
+            });
+    });
+});
+
+it('Shows the checksum for the entropy with the correct groupings', function(done) {
+    driver.findElement(By.css('.use-entropy'))
+        .click();
+    // create a checksum of 20 bits, which spans multiple words
+    driver.findElement(By.css('.entropy'))
+        .sendKeys("F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.checksum'))
+            .getText()
+            .then(function(text) {
+                // first group is 9 bits, second group is 11
+                expect(text).toBe("011010111 01110000110");
+                done();
+            });
+    });
+});
+
 });