1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00
Files
FFmpeg/libavcodec/tests/hashtable.c

111 lines
2.8 KiB
C
Raw Permalink Normal View History

/*
* Generic hashtable tests
* Copyright (C) 2024 Emma Worley <emma@emma.gg>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
#include "libavutil/avassert.h"
#include "libavcodec/hashtable.h"
int main(void)
{
struct FFHashtableContext *ctx;
uint8_t k;
uint64_t v;
// impossibly large allocation should fail gracefully
av_assert0(ff_hashtable_alloc(&ctx, -1, -1, -1) < 0);
// hashtable can store up to 3 uint8_t->uint64_t entries
av_assert0(!ff_hashtable_alloc(&ctx, sizeof(k), sizeof(v), 3));
// unsuccessful deletes return 0
k = 1;
av_assert0(!ff_hashtable_delete(ctx, &k));
// unsuccessful gets return 0
k = 1;
av_assert0(!ff_hashtable_get(ctx, &k, &v));
// successful sets returns 1
k = 1;
v = 1;
av_assert0(ff_hashtable_set(ctx, &k, &v));
// get should now contain 1
k = 1;
v = 0;
av_assert0(ff_hashtable_get(ctx, &k, &v));
av_assert0(v == 1);
// updating sets should return 1
k = 1;
v = 2;
av_assert0(ff_hashtable_set(ctx, &k, &v));
// get should now contain 2
k = 1;
v = 0;
av_assert0(ff_hashtable_get(ctx, &k, &v));
av_assert0(v == 2);
// fill the table
k = 2;
v = 2;
av_assert0(ff_hashtable_set(ctx, &k, &v));
k = 3;
v = 3;
av_assert0(ff_hashtable_set(ctx, &k, &v));
// inserting sets on a full table should return 0
k = 4;
v = 4;
av_assert0(!ff_hashtable_set(ctx, &k, &v));
// updating sets on a full table should return 1
k = 1;
v = 4;
av_assert0(ff_hashtable_set(ctx, &k, &v));
v = 0;
av_assert0(ff_hashtable_get(ctx, &k, &v));
av_assert0(v == 4);
// successful deletes should return 1
k = 1;
av_assert0(ff_hashtable_delete(ctx, &k));
// get should now return 0
av_assert0(!ff_hashtable_get(ctx, &k, &v));
// sanity check remaining keys
k = 2;
v = 0;
av_assert0(ff_hashtable_get(ctx, &k, &v));
av_assert0(v == 2);
k = 3;
v = 0;
av_assert0(ff_hashtable_get(ctx, &k, &v));
av_assert0(v == 3);
ff_hashtable_freep(&ctx);
return 0;
}