diff --git a/test/fortran/test_sort.f90 b/test/fortran/test_sort.f90 index 4a63e7ee40a0ab5f4f9b1684104e44ad3d9df420..89048e4c86f75624da1fd1f2442dcda6378f521f 100644 --- a/test/fortran/test_sort.f90 +++ b/test/fortran/test_sort.f90 @@ -15,55 +15,181 @@ MODULE TEST_mo_util_sort CONTAINS SUBROUTINE TEST_quicksort_real - USE mo_util_sort + USE mo_util_sort, ONLY: quicksort REAL(wp) :: to_sort(6) = (/144.4, 58.6, 4.3, 7.8, 10.0, 11.0/) - CALL TAG_TEST("TEST_quicksort_real_1") + CALL TAG_TEST("TEST_quicksort_real_before") CALL ASSERT_EQUAL(is_sorted_real(to_sort), .FALSE.) + + CALL quicksort(to_sort) + + CALL TAG_TEST("TEST_quicksort_real_after") + CALL ASSERT_EQUAL(is_sorted_real(to_sort), .TRUE.) + END SUBROUTINE + + SUBROUTINE TEST_quicksort_real2 + USE mo_util_sort, ONLY: quicksort + REAL(wp) :: to_sort(6) = (/144.4, 11.0, 4.3, 58.6, 10.0, 7.8/) + CALL TAG_TEST("TEST_quicksort_real2_before") + CALL ASSERT_EQUAL(is_sorted_real(to_sort), .FALSE.) + CALL quicksort(to_sort) - CALL TAG_TEST("TEST_quicksort_real_2") + + CALL TAG_TEST("TEST_quicksort_real2_after") CALL ASSERT_EQUAL(is_sorted_real(to_sort), .TRUE.) END SUBROUTINE + SUBROUTINE TEST_quicksort_real_random + USE mo_util_sort, ONLY: quicksort + REAL(wp) :: to_sort(6) + ! Generate random numbers geq 0.0 and < 256.0 + CALL RANDOM_NUMBER(to_sort) + to_sort = to_sort*256 + + CALL quicksort(to_sort) + + CALL TAG_TEST("TEST_quicksort_real_random") + CALL ASSERT_EQUAL(is_sorted_real(to_sort), .TRUE.) + END SUBROUTINE + + SUBROUTINE TEST_quicksort_permutation_real + USE mo_util_sort, ONLY: quicksort + REAL(wp) :: to_sort(6) = (/144.4, 58.6, 4.3, 7.8, 10.0, 11.0/) + INTEGER :: idx_permutation(6) = (/1, 2, 3, 4, 5, 6/) + CALL TAG_TEST("TEST_quicksort_permutation_real_before") + CALL ASSERT_EQUAL(is_sorted_real(to_sort), .FALSE.) + + CALL quicksort(to_sort, idx_permutation) + + CALL TAG_TEST("TEST_quicksort_permutation_real_after") + CALL ASSERT_EQUAL(is_sorted_real(to_sort), .TRUE.) + CALL TAG_TEST("TEST_quicksort_permutation_real_permutation") + CALL ASSERT_EQUAL(has_same_values_int(idx_permutation, (/3, 4, 5, 6, 2, 1/)), .TRUE.) + END SUBROUTINE + SUBROUTINE TEST_quicksort_int - USE mo_util_sort + USE mo_util_sort, ONLY: quicksort INTEGER :: to_sort(6) = (/144, 58, 4, 7, 10, 11/) - CALL TAG_TEST("TEST_quicksort_int_1") + CALL TAG_TEST("TEST_quicksort_int_before") + CALL ASSERT_EQUAL(is_sorted_int(to_sort), .FALSE.) + + CALL quicksort(to_sort) + + CALL TAG_TEST("TEST_quicksort_int_after") + CALL ASSERT_EQUAL(is_sorted_int(to_sort), .TRUE.) + END SUBROUTINE + + SUBROUTINE TEST_quicksort_int2 + USE mo_util_sort, ONLY: quicksort + INTEGER :: to_sort(6) = (/58, 4, 144, 10, 7, 11/) + CALL TAG_TEST("TEST_quicksort_int2_before") CALL ASSERT_EQUAL(is_sorted_int(to_sort), .FALSE.) + CALL quicksort(to_sort) - CALL TAG_TEST("TEST_quicksort_int_2") + + CALL TAG_TEST("TEST_quicksort_int2_after") + CALL ASSERT_EQUAL(is_sorted_int(to_sort), .TRUE.) + END SUBROUTINE + + SUBROUTINE TEST_quicksort_int_random + USE mo_util_sort, ONLY: quicksort + INTEGER :: to_sort(6) + REAL(wp) :: random_wp(6) + ! Generate random numbers between 0 and 255 + CALL RANDOM_NUMBER(random_wp) + to_sort = FLOOR(random_wp*256) + + CALL quicksort(to_sort) + + CALL TAG_TEST("TEST_quicksort_int_random") CALL ASSERT_EQUAL(is_sorted_int(to_sort), .TRUE.) END SUBROUTINE SUBROUTINE TEST_quicksort_permutation_int - USE mo_util_sort + USE mo_util_sort, ONLY: quicksort INTEGER :: to_sort(6) = (/144, 58, 4, 7, 10, 11/) INTEGER :: idx_permutation(6) = (/1, 2, 3, 4, 5, 6/) - CALL TAG_TEST("TEST_quicksort_permutation_int_1") + CALL TAG_TEST("TEST_quicksort_permutation_int_before") CALL ASSERT_EQUAL(is_sorted_int(to_sort), .FALSE.) + CALL quicksort(to_sort, idx_permutation) - CALL TAG_TEST("TEST_quicksort_permutation_int_2") + + CALL TAG_TEST("TEST_quicksort_permutation_int_after") CALL ASSERT_EQUAL(is_sorted_int(to_sort), .TRUE.) - CALL TAG_TEST("TEST_quicksort_permutation_int_3") + CALL TAG_TEST("TEST_quicksort_permutation_int_permutation") CALL ASSERT_EQUAL(has_same_values_int(idx_permutation, (/3, 4, 5, 6, 2, 1/)), .TRUE.) END SUBROUTINE SUBROUTINE TEST_quicksort_string - USE mo_util_sort + USE mo_util_sort, ONLY: quicksort CHARACTER :: to_sort(6) = (/'A', 'C', 'Y', 'E', 'S', 'H'/) - CALL TAG_TEST("TEST_quicksort_string_1") + CALL TAG_TEST("TEST_quicksort_string_before") + CALL ASSERT_EQUAL(is_sorted_string(to_sort), .FALSE.) + + CALL quicksort(to_sort) + + CALL TAG_TEST("TEST_quicksort_string_after") + CALL ASSERT_EQUAL(is_sorted_string(to_sort), .TRUE.) + END SUBROUTINE + + SUBROUTINE TEST_quicksort_string2 + USE mo_util_sort, ONLY: quicksort + CHARACTER :: to_sort(6) = (/'Y', 'H', 'A', 'S', 'E', 'C'/) + CALL TAG_TEST("TEST_quicksort_string2_before") + CALL ASSERT_EQUAL(is_sorted_string(to_sort), .FALSE.) + + CALL quicksort(to_sort) + + CALL TAG_TEST("TEST_quicksort_string2_after") + CALL ASSERT_EQUAL(is_sorted_string(to_sort), .TRUE.) + END SUBROUTINE + + SUBROUTINE TEST_quicksort_string3 + USE mo_util_sort, ONLY: quicksort + CHARACTER :: to_sort(6) = (/'P', 'M', 'W', 'G', 'K', 'D'/) + CALL TAG_TEST("TEST_quicksort_string3_before") CALL ASSERT_EQUAL(is_sorted_string(to_sort), .FALSE.) + + CALL quicksort(to_sort) + + CALL TAG_TEST("TEST_quicksort_string3_after") + CALL ASSERT_EQUAL(is_sorted_string(to_sort), .TRUE.) + END SUBROUTINE + + SUBROUTINE TEST_quicksort_string4 + USE mo_util_sort, ONLY: quicksort + CHARACTER :: to_sort(6) = (/'B', 'L', 'Q', 'S', 'Z', 'T'/) + CALL TAG_TEST("TEST_quicksort_string4_before") + CALL ASSERT_EQUAL(is_sorted_string(to_sort), .FALSE.) + CALL quicksort(to_sort) - CALL TAG_TEST("TEST_quicksort_string_2") + + CALL TAG_TEST("TEST_quicksort_string4_after") CALL ASSERT_EQUAL(is_sorted_string(to_sort), .TRUE.) END SUBROUTINE SUBROUTINE TEST_insertion_sort_int - USE mo_util_sort + USE mo_util_sort, ONLY: insertion_sort INTEGER :: to_sort(6) = (/144, 58, 4, 7, 10, 11/) - CALL TAG_TEST("TEST_insertion_sort_int_1") + CALL TAG_TEST("TEST_insertion_sort_int_before") CALL ASSERT_EQUAL(is_sorted_int(to_sort), .FALSE.) - CALL quicksort(to_sort) - CALL TAG_TEST("TEST_insertion_sort_int_2") + + CALL insertion_sort(to_sort) + + CALL TAG_TEST("TEST_insertion_sort_int_after") + CALL ASSERT_EQUAL(is_sorted_int(to_sort), .TRUE.) + END SUBROUTINE + + SUBROUTINE TEST_insertion_sort_int_random + USE mo_util_sort, ONLY: insertion_sort + INTEGER :: to_sort(6) + REAL(wp) :: random_wp(6) + ! Generate random numbers between 0 and 255 + CALL RANDOM_NUMBER(random_wp) + to_sort = FLOOR(random_wp*256) + + CALL insertion_sort(to_sort) + + CALL TAG_TEST("TEST_insertion_sort_int_random") CALL ASSERT_EQUAL(is_sorted_int(to_sort), .TRUE.) END SUBROUTINE