Skip to content
Snippets Groups Projects
Commit 0241e520 authored by Yen-Chen Chen's avatar Yen-Chen Chen Committed by Jonas Jucker
Browse files

Improve unit tests for mo_util_sort (!79)

## What is the bug
Fix a bug in unit test ([here](!79 (diffs))

) and improve code coverage
## How do you fix it
The code coverage is improved to 100% for `mo_util_sort`, and new tests with random values are added.

Approved-by: default avatarJonas Jucker <jonas.jucker@env.ethz.ch>
Merged-by: default avatarJonas Jucker <jonas.jucker@env.ethz.ch>
Changelog: bugfix
parent 243a7a39
No related branches found
No related tags found
1 merge request!79Improve unit tests for mo_util_sort
Pipeline #63410 passed
...@@ -15,55 +15,181 @@ MODULE TEST_mo_util_sort ...@@ -15,55 +15,181 @@ MODULE TEST_mo_util_sort
CONTAINS CONTAINS
SUBROUTINE TEST_quicksort_real 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/) 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 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 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.) CALL ASSERT_EQUAL(is_sorted_real(to_sort), .TRUE.)
END SUBROUTINE 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 SUBROUTINE TEST_quicksort_int
USE mo_util_sort USE mo_util_sort, ONLY: quicksort
INTEGER :: to_sort(6) = (/144, 58, 4, 7, 10, 11/) 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 ASSERT_EQUAL(is_sorted_int(to_sort), .FALSE.)
CALL quicksort(to_sort) 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.) CALL ASSERT_EQUAL(is_sorted_int(to_sort), .TRUE.)
END SUBROUTINE END SUBROUTINE
SUBROUTINE TEST_quicksort_permutation_int 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 :: to_sort(6) = (/144, 58, 4, 7, 10, 11/)
INTEGER :: idx_permutation(6) = (/1, 2, 3, 4, 5, 6/) 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 ASSERT_EQUAL(is_sorted_int(to_sort), .FALSE.)
CALL quicksort(to_sort, idx_permutation) 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 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.) CALL ASSERT_EQUAL(has_same_values_int(idx_permutation, (/3, 4, 5, 6, 2, 1/)), .TRUE.)
END SUBROUTINE END SUBROUTINE
SUBROUTINE TEST_quicksort_string SUBROUTINE TEST_quicksort_string
USE mo_util_sort USE mo_util_sort, ONLY: quicksort
CHARACTER :: to_sort(6) = (/'A', 'C', 'Y', 'E', 'S', 'H'/) 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 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 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.) CALL ASSERT_EQUAL(is_sorted_string(to_sort), .TRUE.)
END SUBROUTINE END SUBROUTINE
SUBROUTINE TEST_insertion_sort_int 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/) 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 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.) CALL ASSERT_EQUAL(is_sorted_int(to_sort), .TRUE.)
END SUBROUTINE END SUBROUTINE
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment