text: #include "config.h"
  #include "../fp16.c"
  #include <common/setup.h>
  #include <common/type_to_string.h>
  #include <stdio.h>
  #include <wire/wire.h>
  
  /* AUTOGENERATED MOCKS START */
  /* Generated stub for amount_asset_is_main */
  bool amount_asset_is_main(struct amount_asset *asset UNNEEDED)
  { fprintf(stderr, "amount_asset_is_main called!\n"); abort(); }
  /* Generated stub for amount_asset_to_sat */
  struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED)
  { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); }
  /* Generated stub for amount_sat */
  struct amount_sat amount_sat(u64 satoshis UNNEEDED)
  { fprintf(stderr, "amount_sat called!\n"); abort(); }
  /* Generated stub for amount_sat_add */
   bool amount_sat_add(struct amount_sat *val UNNEEDED,
  				       struct amount_sat a UNNEEDED,
  				       struct amount_sat b UNNEEDED)
  { fprintf(stderr, "amount_sat_add called!\n"); abort(); }
  /* Generated stub for amount_sat_eq */
  bool amount_sat_eq(struct amount_sat a UNNEEDED, struct amount_sat b UNNEEDED)
  { fprintf(stderr, "amount_sat_eq called!\n"); abort(); }
  /* Generated stub for amount_sat_greater_eq */
  bool amount_sat_greater_eq(struct amount_sat a UNNEEDED, struct amount_sat b UNNEEDED)
  { fprintf(stderr, "amount_sat_greater_eq called!\n"); abort(); }
  /* Generated stub for amount_sat_sub */
   bool amount_sat_sub(struct amount_sat *val UNNEEDED,
  				       struct amount_sat a UNNEEDED,
  				       struct amount_sat b UNNEEDED)
  { fprintf(stderr, "amount_sat_sub called!\n"); abort(); }
  /* Generated stub for amount_sat_to_asset */
  struct amount_asset amount_sat_to_asset(struct amount_sat *sat UNNEEDED, const u8 *asset UNNEEDED)
  { fprintf(stderr, "amount_sat_to_asset called!\n"); abort(); }
  /* Generated stub for amount_tx_fee */
  struct amount_sat amount_tx_fee(u32 fee_per_kw UNNEEDED, size_t weight UNNEEDED)
  { fprintf(stderr, "amount_tx_fee called!\n"); abort(); }
  /* Generated stub for fromwire */
  const u8 *fromwire(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, void *copy UNNEEDED, size_t n UNNEEDED)
  { fprintf(stderr, "fromwire called!\n"); abort(); }
  /* Generated stub for fromwire_bool */
  bool fromwire_bool(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
  { fprintf(stderr, "fromwire_bool called!\n"); abort(); }
  /* Generated stub for fromwire_fail */
  void *fromwire_fail(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
  { fprintf(stderr, "fromwire_fail called!\n"); abort(); }
  /* Generated stub for fromwire_secp256k1_ecdsa_signature */
  void fromwire_secp256k1_ecdsa_signature(const u8 **cursor UNNEEDED, size_t *max UNNEEDED,
  					secp256k1_ecdsa_signature *signature UNNEEDED)
  { fprintf(stderr, "fromwire_secp256k1_ecdsa_signature called!\n"); abort(); }
  /* Generated stub for fromwire_sha256 */
  void fromwire_sha256(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct sha256 *sha256 UNNEEDED)
  { fprintf(stderr, "fromwire_sha256 called!\n"); abort(); }
  /* Generated stub for fromwire_tal_arrn */
  u8 *fromwire_tal_arrn(const tal_t *ctx UNNEEDED,
  		       const u8 **cursor UNNEEDED, size_t *max UNNEEDED, size_t num UNNEEDED)
  { fprintf(stderr, "fromwire_tal_arrn called!\n"); abort(); }
  /* Generated stub for fromwire_u32 */
  u32 fromwire_u32(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
  { fprintf(stderr, "fromwire_u32 called!\n"); abort(); }
  /* Generated stub for fromwire_u64 */
  u64 fromwire_u64(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
  { fprintf(stderr, "fromwire_u64 called!\n"); abort(); }
  /* Generated stub for fromwire_u8 */
  u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
  { fprintf(stderr, "fromwire_u8 called!\n"); abort(); }
  /* Generated stub for fromwire_u8_array */
  void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr UNNEEDED, size_t num UNNEEDED)
  { fprintf(stderr, "fromwire_u8_array called!\n"); abort(); }
  /* Generated stub for towire */
  void towire(u8 **pptr UNNEEDED, const void *data UNNEEDED, size_t len UNNEEDED)
  { fprintf(stderr, "towire called!\n"); abort(); }
  /* Generated stub for towire_bool */
  void towire_bool(u8 **pptr UNNEEDED, bool v UNNEEDED)
  { fprintf(stderr, "towire_bool called!\n"); abort(); }
  /* Generated stub for towire_secp256k1_ecdsa_signature */
  void towire_secp256k1_ecdsa_signature(u8 **pptr UNNEEDED,
  			      const secp256k1_ecdsa_signature *signature UNNEEDED)
  { fprintf(stderr, "towire_secp256k1_ecdsa_signature called!\n"); abort(); }
  /* Generated stub for towire_sha256 */
  void towire_sha256(u8 **pptr UNNEEDED, const struct sha256 *sha256 UNNEEDED)
  { fprintf(stderr, "towire_sha256 called!\n"); abort(); }
  /* Generated stub for towire_u32 */
  void towire_u32(u8 **pptr UNNEEDED, u32 v UNNEEDED)
  { fprintf(stderr, "towire_u32 called!\n"); abort(); }
  /* Generated stub for towire_u64 */
  void towire_u64(u8 **pptr UNNEEDED, u64 v UNNEEDED)
  { fprintf(stderr, "towire_u64 called!\n"); abort(); }
  /* Generated stub for towire_u8 */
  void towire_u8(u8 **pptr UNNEEDED, u8 v UNNEEDED)
  { fprintf(stderr, "towire_u8 called!\n"); abort(); }
  /* Generated stub for towire_u8_array */
  void towire_u8_array(u8 **pptr UNNEEDED, const u8 *arr UNNEEDED, size_t num UNNEEDED)
  { fprintf(stderr, "towire_u8_array called!\n"); abort(); }
  /* AUTOGENERATED MOCKS END */
  
  int main(int argc, char *argv[])
  {
  	/* 5 bit exponent, 11 bit mantissa. */
  	u32 exponent, mantissa;
  
  	common_setup(argv[0]);
  
  	/* These can be represented exactly. */
  	for (exponent = 0; exponent < (1 << 5); exponent++) {
  		for (mantissa = 0; mantissa < (1 << 11); mantissa++) {
  			u64 v = ((u64)mantissa << exponent);
  			assert(fp16_to_u64(u64_to_fp16(v, false)) == v);
  			assert(fp16_to_u64(u64_to_fp16(v, true)) == v);
  		}
  	}
  
  	/* Now check round up vs down (don't use exponent 32, since that will
  	 * overflow). */
  	for (exponent = 1; exponent < (1 << 5) - 1; exponent++) {
  		/* Too many bits: will require rounding */
  		mantissa = (1 << 11) + 1;
  		u64 v = ((u64)mantissa << exponent);
  
  		assert(fp16_to_u64(u64_to_fp16(v, false))
  		       == ((u64)(mantissa - 1) << exponent));
  		assert(fp16_to_u64(u64_to_fp16(v, true))
  		       == ((u64)(mantissa + 1) << exponent));
  	}
  
  	assert(u64_to_fp16((1ULL << (31 + 11)), false) == 65535);
  	assert(u64_to_fp16((1ULL << (31 + 11)), true) == 65535);
  
  	/* Round up works, even if it causes overflow. */
  	assert(fp16_to_u64(u64_to_fp16(0xffffffff, true)) == (1ULL << 32));
  
  	common_shutdown();
  }
  