xaizek / vifm (License: GPLv2+) (since 2018-12-07)
Vifm is a file manager with curses interface, which provides Vi[m]-like environment for managing objects within file systems, extended with some useful ideas from mutt.
<root> / tests / utils / friendly_size.c (b50bdfe0b00e0565d6c352413b12a63aee10c995) (3,380B) (mode 100644) [raw]
#include <stic.h>

#include "../../src/cfg/config.h"
#include "../../src/utils/utils.h"

SETUP()
{
	cfg.sizefmt.ieci_prefixes = 0;
	cfg.sizefmt.base = 1024;
	cfg.sizefmt.precision = 0;
	cfg.sizefmt.space = 1;
}

TEST(removing_useless_trailing_zero)
{
	char buf[16];

	friendly_size_notation(4*1024, sizeof(buf), buf);
	assert_string_equal("4 K", buf);

	friendly_size_notation(1024*1024 - 1, sizeof(buf), buf);
	assert_string_equal("1 M", buf);
}

TEST(problem_1024)
{
	char buf[16];

	friendly_size_notation(1024*1024 - 2, sizeof(buf), buf);
	assert_string_equal("1 M", buf);
}

TEST(from_zero_rounding)
{
	char buf[16];

	friendly_size_notation(8*1024 - 1, sizeof(buf), buf);
	assert_string_equal("8 K", buf);

	friendly_size_notation(8*1024 + 1, sizeof(buf), buf);
	assert_string_equal("8.1 K", buf);
}

TEST(iso_2)
{
	char buf[16];

	cfg.sizefmt.base = 1000;
	cfg.sizefmt.precision = 2;

	friendly_size_notation(111, sizeof(buf), buf);
	assert_string_equal("111  B", buf);

	friendly_size_notation(1000, sizeof(buf), buf);
	assert_string_equal("1 KB", buf);

	friendly_size_notation(1030, sizeof(buf), buf);
	assert_string_equal("1.03 KB", buf);

	friendly_size_notation(1030000, sizeof(buf), buf);
	assert_string_equal("1.03 MB", buf);

	friendly_size_notation(10301024, sizeof(buf), buf);
	assert_string_equal("10.31 MB", buf);
}

TEST(iec_2)
{
	char buf[16];

	cfg.sizefmt.precision = 2;
	cfg.sizefmt.ieci_prefixes = 1;

	friendly_size_notation(111, sizeof(buf), buf);
	assert_string_equal("111   B", buf);

	friendly_size_notation(1000, sizeof(buf), buf);
	assert_string_equal("1000   B", buf);

	friendly_size_notation(1030, sizeof(buf), buf);
	assert_string_equal("1.01 KiB", buf);

	friendly_size_notation(1030000, sizeof(buf), buf);
	assert_string_equal("1005.86 KiB", buf);

	friendly_size_notation(10301024, sizeof(buf), buf);
	assert_string_equal("9.83 MiB", buf);
}

TEST(iec_3)
{
	char buf[16];

	cfg.sizefmt.precision = 3;

	friendly_size_notation(111, sizeof(buf), buf);
	assert_string_equal("111 B", buf);

	friendly_size_notation(1000, sizeof(buf), buf);
	assert_string_equal("1000 B", buf);

	friendly_size_notation(1030, sizeof(buf), buf);
	assert_string_equal("1.006 K", buf);

	friendly_size_notation(1030000, sizeof(buf), buf);
	assert_string_equal("1005.86 K", buf);

	friendly_size_notation(10301024, sizeof(buf), buf);
	assert_string_equal("9.824 M", buf);
}

TEST(huge_precision)
{
	char buf[64];

	cfg.sizefmt.precision = 10;
	friendly_size_notation(231093, sizeof(buf), buf);
	assert_string_equal("225.6767578125 K", buf);

	/* Compiler optimizes operations somewhat differently, so don't expect an
	 * exact match. */
	cfg.sizefmt.precision = 25;
	friendly_size_notation(231093, sizeof(buf), buf);
	assert_string_starts_with("225.676757812", buf);
	assert_string_ends_with(" K", buf);
}

TEST(nospace)
{
	char buf[16];

	cfg.sizefmt.ieci_prefixes = 1;
	cfg.sizefmt.precision = 0;
	cfg.sizefmt.space = 0;

	friendly_size_notation(10301024, sizeof(buf), buf);
	assert_string_equal("10MiB", buf);
}

TEST(nospace_with_precision)
{
	char buf[16];

	cfg.sizefmt.ieci_prefixes = 1;
	cfg.sizefmt.precision = 2;
	cfg.sizefmt.space = 0;

	friendly_size_notation(10301024, sizeof(buf), buf);
	assert_string_equal("9.83MiB", buf);
}

/* vim: set tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab cinoptions-=(0 : */
/* vim: set cinoptions+=t0 filetype=c : */
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/vifm

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/vifm

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master