ggstd 0.1.0

Partial implementation of Go standard library
Documentation
// Copyright 2023 The rust-ggstd authors. All rights reserved.
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// SHA-1 hash algorithm. See RFC 3174.

use crate::encoding::hex;
use crate::hash::Hash;

struct Sha1test {
    out: &'static str,
    input: &'static str,
    // 	halfState string // marshaled hash state after first half of in written, used by TestGoldenMarshal
}
impl Sha1test {
    const fn new(out: &'static str, input: &'static str) -> Self {
        Self { out, input }
    }
}

const GOLDEN: &[Sha1test] = &[
	Sha1test::new("76245dbf96f661bd221046197ab8b9f063f11bad", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", /*"sha\x01\v\xa0)I\xdeq(8h\x9ev\xe5\x88[\xf8\x81\x17\xba4Daaaaaaaaaaaaaaaaaaaaaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96"*/),
	Sha1test::new("da39a3ee5e6b4b0d3255bfef95601890afd80709", "", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"*/),
	Sha1test::new("86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", "a", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"*/),
	Sha1test::new("da23614e02469a0d7c7bd1bdab5c9c474b1904dc", "ab", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"*/),
	Sha1test::new("a9993e364706816aba3e25717850c26c9cd0d89d", "abc", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"*/),
	Sha1test::new("81fe8bfe87576c3ecb22426f8e57847382917acf", "abcd", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0ab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02"*/),
	Sha1test::new("03de6c570bfe24bfc328ccd7ca46b76eadaf4334", "abcde", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0ab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02"*/),
	Sha1test::new("1f8ac10f23c5b5bc1167bda84b833e5c057a77d2", "abcdef", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0abc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03"*/),
	Sha1test::new("2fb5e13419fc89246865e7a324f476ec624e8740", "abcdefg", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0abc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03"*/),
	Sha1test::new("425af12a0743502b322e93a015bcf868e324d56a", "abcdefgh", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0abcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"*/),
	Sha1test::new("c63b19f1e4c8b5f76b25c49b8b87f57d8e4872a1", "abcdefghi", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0abcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"*/),
	Sha1test::new("d68c19a0a345b7eab78d5e11e991c026ec60db63", "abcdefghij", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0abcde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05"*/),
	Sha1test::new("ebf81ddcbe5bf13aaabdc4d65354fdf2044f38a7", "Discard medicine more than two years old.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0Discard medicine mor\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14"*/),
	Sha1test::new("e5dea09392dd886ca63531aaa00571dc07554bb6", "He who has a shady past knows that nice guys finish last.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0He who has a shady past know\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c"*/),
	Sha1test::new("45988f7234467b94e3e9494434c96ee3609d8f8f", "I wouldn't marry him with a ten foot pole.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0I wouldn't marry him \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15"*/),
	Sha1test::new("55dee037eb7460d5a692d1ce11330b260e40c988", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0Free! Free!/A trip/to Mars/f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c"*/),
	Sha1test::new("b7bc5fb91080c7de6b582ea281f8a396d7c0aee8", "The days of the digital watch are numbered.  -Tom Stoppard", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0The days of the digital watch\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d"*/),
	Sha1test::new("c3aed9358f7c77f523afe86135f06b95b3999797", "Nepal premier won't resign.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0Nepal premier\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r"*/),
	Sha1test::new("6e29d302bf6e3a5e4305ff318d983197d6906bb9", "For every action there is an equal and opposite government program.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0For every action there is an equa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!"*/),
	Sha1test::new("597f6a540010f94c15d71806a99a2c8710e747bd", "His money is twice tainted: 'taint yours and 'taint mine.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0His money is twice tainted: \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c"*/),
	Sha1test::new("6859733b2590a8a091cecf50086febc5ceef1e80", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0There is no reason for any individual to hav\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,"*/),
	Sha1test::new("514b2630ec089b8aee18795fc0cf1f4860cdacad", "It's a tiny change to the code and not completely disgusting. - Bob Manchek", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0It's a tiny change to the code and no\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%"*/),
	Sha1test::new("c5ca0d4a7b6676fc7aa72caa41cc3d5df567ed69", "size:  a.out:  bad magic", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0size:  a.out\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f"*/),
	Sha1test::new("74c51fa9a04eadc8c1bbeaa7fc442f834b90a00a", "The major problem is with sendmail.  -Mark Horton", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0The major problem is wit\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18"*/),
	Sha1test::new("0b4c4ce5f52c3ad2821852a8dc00217fa18b8b66", "Give me a rock, paper and scissors and I will move the world.  CCFestoon", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0Give me a rock, paper and scissors a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$"*/),
	Sha1test::new("3ae7937dd790315beb0f48330e8642237c61550a", "If the enemy is within range, then so are you.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0If the enemy is within \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17"*/),
	Sha1test::new("410a2b296df92b9a47412b13281df8f830a9f44b", "It's well we cannot hear the screams/That we create in others' dreams.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0It's well we cannot hear the scream\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#"*/),
	Sha1test::new("841e7c85ca1adcddbdd0187f1289acb5c642f7f5", "You remind me of a TV show, but that's all right: I watch it anyway.", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0You remind me of a TV show, but th\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\""*/),
	Sha1test::new("163173b825d03b952601376b25212df66763e1db", "C is as portable as Stonehedge!!", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0C is as portable\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10"*/),
	Sha1test::new("32b0377f2687eb88e22106f133c586ab314d5279", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0Even if I could be Shakespeare, I think I sh\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,"*/),
	Sha1test::new("0885aaf99b569542fd165fa44e322718f4a984e0", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule", /*"sha\x01x}\xf4\r\xeb\xf2\x10\x87\xe8[\xb2JA$D\xb7\u063ax8em\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B"*/),
	Sha1test::new("6627d6904d71420b0bf3886ab629623538689f45", "How can you write a big system without C++?  -Paul Glick", /*"sha\x01gE#\x01\xef\u036b\x89\x98\xba\xdc\xfe\x102Tv\xc3\xd2\xe1\xf0How can you write a big syst\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c"*/),
];

#[test]
fn test_golden() {
    for g in GOLDEN {
        let s = hex::encode_to_string(&super::sum(g.input.as_bytes()));
        assert_eq!(
            s, g.out,
            "sum function: sha1({}) = {} want {}",
            g.input, s, g.out
        );
        let mut c = super::Digest::new();
        for j in 0..3 {
            let data = g.input.as_bytes();
            if j < 2 {
                c.write(data);
            } else {
                c.write(&data[0..data.len() / 2]);
                _ = c.sum(&[]);
                c.write(&data[data.len() / 2..]);
            }
            // 			case 3:
            // 				if boring.Enabled {
            // 					continue
            // 				}
            // 				io.WriteString(c, g.in[0:len(g.in)/2])
            // 				c.(*digest).ConstantTimeSum(nil)
            // 				io.WriteString(c, g.in[len(g.in)/2:])
            // 				sum = c.(*digest).ConstantTimeSum(nil)
            let s = hex::encode_to_string(&c.sum(&[]));
            assert_eq!(s, g.out, "sha1[{}]({}) = {} want {}", j, g.input, s, g.out);
            c.reset();
        }
    }
}
// func TestGolden(t *testing.T) {
// 	for i := 0; i < len(golden); i++ {
// 		g := golden[i]
// 		s := fmt.Sprintf("%x", Sum([]byte(g.in)))
// 		if s != g.out {
// 			t.Fatalf("Sum function: sha1(%s) = %s want %s", g.in, s, g.out)
// 		}
// 		c := New()
// 		for j := 0; j < 4; j++ {
// 			var sum []byte
// 			switch j {
// 			case 0, 1:
// 				io.WriteString(c, g.in)
// 				sum = c.Sum(nil)
// 			case 2:
// 				io.WriteString(c, g.in[0:len(g.in)/2])
// 				c.Sum(nil)
// 				io.WriteString(c, g.in[len(g.in)/2:])
// 				sum = c.Sum(nil)
// 			case 3:
// 				if boring.Enabled {
// 					continue
// 				}
// 				io.WriteString(c, g.in[0:len(g.in)/2])
// 				c.(*digest).ConstantTimeSum(nil)
// 				io.WriteString(c, g.in[len(g.in)/2:])
// 				sum = c.(*digest).ConstantTimeSum(nil)
// 			}
// 			s := fmt.Sprintf("%x", sum)
// 			if s != g.out {
// 				t.Fatalf("sha1[%d](%s) = %s want %s", j, g.in, s, g.out)
// 			}
// 			c.Reset()
// 		}
// 	}
// }

// func TestGoldenMarshal(t *testing.T) {
// 	h := New()
// 	h2 := New()
// 	for _, g := range golden {
// 		h.Reset()
// 		h2.Reset()

// 		io.WriteString(h, g.in[:len(g.in)/2])

// 		state, err := h.(encoding.BinaryMarshaler).MarshalBinary()
// 		if err != nil {
// 			t.Errorf("could not marshal: %v", err)
// 			continue
// 		}

// 		if string(state) != g.halfState {
// 			t.Errorf("sha1(%q) state = %+q, want %+q", g.in, state, g.halfState)
// 			continue
// 		}

// 		if err := h2.(encoding.BinaryUnmarshaler).UnmarshalBinary(state); err != nil {
// 			t.Errorf("could not unmarshal: %v", err)
// 			continue
// 		}

// 		io.WriteString(h, g.in[len(g.in)/2:])
// 		io.WriteString(h2, g.in[len(g.in)/2:])

// 		if actual, actual2 := h.Sum(nil), h2.Sum(nil); !bytes.Equal(actual, actual2) {
// 			t.Errorf("sha1(%q) = 0x%x != marshaled 0x%x", g.in, actual, actual2)
// 		}
// 	}
// }

#[test]
fn test_size() {
    let c = super::Digest::new();
    let got = c.size();
    assert_eq!(got, super::SIZE, "Size = {}; want {}", got, super::SIZE);
}

#[test]
fn test_block_size() {
    let c = super::Digest::new();
    let got = c.block_size();
    assert_eq!(
        got,
        super::BLOCK_SIZE,
        "block_size = {} want {}",
        got,
        super::BLOCK_SIZE
    );
}

// // Tests that blockGeneric (pure Go) and block (in assembly for some architectures) match.
// func TestBlockGeneric(t *testing.T) {
// 	if boring.Enabled {
// 		t.Skip("BoringCrypto doesn't expose digest")
// 	}
// 	for i := 1; i < 30; i++ { // arbitrary factor
// 		gen, asm := New().(*digest), New().(*digest)
// 		buf := make([]byte, block_size*i)
// 		rand.Read(buf)
// 		blockGeneric(gen, buf)
// 		block(asm, buf)
// 		if *gen != *asm {
// 			t.Errorf("For %#v block and blockGeneric resulted in different states", buf)
// 		}
// 	}
// }

// // Tests for unmarshaling hashes that have hashed a large amount of data
// // The initial hash generation is omitted from the test, because it takes a long time.
// // The test contains some already-generated states, and their expected sums
// // Tests a problem that is outlined in GitHub issue #29543
// // The problem is triggered when an amount of data has been hashed for which
// // the data length has a 1 in the 32nd bit. When casted to int, this changes
// // the sign of the value, and causes the modulus operation to return a
// // different result.
// type unmarshalTest struct {
// 	state string
// 	sum   string
// }

// var largeUnmarshalTests = []unmarshalTest{
// 	// Data length: 7_102_415_735
// 	{
// 		state: "sha\x01\x13\xbc\xfe\x83\x8c\xbd\xdfP\x1f\xd8ڿ<\x9eji8t\xe1\xa5@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa7VCw",
// 		sum:   "bc6245c9959cc33e1c2592e5c9ea9b5d0431246c",
// 	},
// 	// Data length: 6_565_544_823
// 	{
// 		state: "sha\x01m;\x16\xa6R\xbe@\xa9nĈ\xf9S\x03\x00B\xc2\xdcv\xcf@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87VCw",
// 		sum:   "8f2d1c0e4271768f35feb918bfe21ea1387a2072",
// 	},
// }

// func safeSum(h hash.Hash) (sum []byte, err error) {
// 	defer func() {
// 		if r := recover(); r != nil {
// 			err = fmt.Errorf("sum panic: %v", r)
// 		}
// 	}()

// 	return h.Sum(nil), nil
// }

// func TestLargeHashes(t *testing.T) {
// 	for i, test := range largeUnmarshalTests {

// 		h := New()
// 		if err := h.(encoding.BinaryUnmarshaler).UnmarshalBinary([]byte(test.state)); err != nil {
// 			t.Errorf("test %d could not unmarshal: %v", i, err)
// 			continue
// 		}

// 		sum, err := safeSum(h)
// 		if err != nil {
// 			t.Errorf("test %d could not sum: %v", i, err)
// 			continue
// 		}

// 		if fmt.Sprintf("%x", sum) != test.sum {
// 			t.Errorf("test %d sum mismatch: expect %s got %x", i, test.sum, sum)
// 		}
// 	}
// }

// func TestAllocations(t *testing.T) {
// 	if boring.Enabled {
// 		t.Skip("BoringCrypto doesn't allocate the same way as stdlib")
// 	}
// 	in := []byte("hello, world!")
// 	out := make([]byte, 0, Size)
// 	h := New()
// 	n := int(testing.AllocsPerRun(10, func() {
// 		h.Reset()
// 		h.Write(in)
// 		out = h.Sum(out[:0])
// 	}))
// 	if n > 0 {
// 		t.Errorf("allocs = %d, want 0", n)
// 	}
// }

// var bench = New()
// var buf = make([]byte, 8192)

// func benchmarkSize(b *testing.B, size int) {
// 	sum := make([]byte, bench.Size())
// 	b.Run("New", func(b *testing.B) {
// 		b.ReportAllocs()
// 		b.SetBytes(int64(size))
// 		for i := 0; i < b.N; i++ {
// 			bench.Reset()
// 			bench.Write(buf[:size])
// 			bench.Sum(sum[:0])
// 		}
// 	})
// 	b.Run("Sum", func(b *testing.B) {
// 		b.ReportAllocs()
// 		b.SetBytes(int64(size))
// 		for i := 0; i < b.N; i++ {
// 			Sum(buf[:size])
// 		}
// 	})
// }

// func BenchmarkHash8Bytes(b *testing.B) {
// 	benchmarkSize(b, 8)
// }

// func BenchmarkHash320Bytes(b *testing.B) {
// 	benchmarkSize(b, 320)
// }

// func BenchmarkHash1K(b *testing.B) {
// 	benchmarkSize(b, 1024)
// }

// func BenchmarkHash8K(b *testing.B) {
// 	benchmarkSize(b, 8192)
// }