// Copyright 2024 Aerospike, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package util

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func Test_SortBackupFiles(t *testing.T) {
	t.Parallel()

	list := []string{
		"0_source-ns1_1.asbx",
		"0_source-ns1_6.asbx",
		"0_source-ns1_7.asbx",
		"0_source-ns1_8.asbx",
		"0_source-ns1_2.asbx",
		"0_source-ns1_3.asbx",
		"0_source-ns1_4.asbx",
		"0_source-ns1_5.asbx",
		"0_source-ns1_9.asbx",
		"0_source-ns1_11.asbx",
		"0_source-ns1_121.asbx",
		"0_source-ns1_122.asbx",
		"0_source-ns1_123.asbx",
		"0_source-ns1_157.asbx",
		"1_source-ns1_10.asbx",
		"1_source-ns1_124.asbx",
		"1_source-ns1_125.asbx",
		"1_source-ns1_126.asbx",
		"1_source-ns1_158.asbx",
		"1_source-ns1_12.asbx",
		"1_source-ns1_13.asbx",
		"1_source-ns1_14.asbx",
		"1_source-ns1_15.asbx",
		"1_source-ns1_16.asbx",
		"1_source-ns1_17.asbx",
		"1_source-ns1_18.asbx",
		"1_source-ns1_19.asbx",
		"1_source-ns1_20.asbx",
		"2_source-ns1_21.asbx",
		"2_source-ns1_22.asbx",
		"2_source-ns1_127.asbx",
		"2_source-ns1_128.asbx",
		"2_source-ns1_129.asbx",
		"2_source-ns1_159.asbx",
		"3_source-ns1_30.asbx",
		"3_source-ns1_32.asbx",
		"3_source-ns1_33.asbx",
		"3_source-ns1_34.asbx",
		"3_source-ns1_35.asbx",
		"3_source-ns1_36.asbx",
		"3_source-ns1_37.asbx",
		"3_source-ns1_38.asbx",
		"3_source-ns1_39.asbx",
		"3_source-ns1_40.asbx",
		"2_source-ns1_23.asbx",
		"2_source-ns1_24.asbx",
		"2_source-ns1_25.asbx",
		"2_source-ns1_26.asbx",
		"2_source-ns1_27.asbx",
		"2_source-ns1_28.asbx",
		"2_source-ns1_29.asbx",
		"2_source-ns1_31.asbx",
		"3_source-ns1_130.asbx",
		"3_source-ns1_131.asbx",
		"3_source-ns1_132.asbx",
		"3_source-ns1_160.asbx",
		"4_source-ns1_41.asbx",
		"4_source-ns1_42.asbx",
		"4_source-ns1_43.asbx",
		"4_source-ns1_44.asbx",
		"4_source-ns1_45.asbx",
		"4_source-ns1_46.asbx",
		"5_source-ns1_51.asbx",
		"5_source-ns1_52.asbx",
		"5_source-ns1_53.asbx",
		"5_source-ns1_54.asbx",
		"5_source-ns1_55.asbx",
		"5_source-ns1_56.asbx",
		"5_source-ns1_57.asbx",
		"5_source-ns1_58.asbx",
		"5_source-ns1_59.asbx",
		"5_source-ns1_60.asbx",
		"5_source-ns1_136.asbx",
		"5_source-ns1_137.asbx",
		"5_source-ns1_138.asbx",
		"5_source-ns1_162.asbx",
		"6_source-ns1_61.asbx",
		"6_source-ns1_62.asbx",
		"4_source-ns1_47.asbx",
		"4_source-ns1_48.asbx",
		"4_source-ns1_49.asbx",
		"4_source-ns1_50.asbx",
		"4_source-ns1_133.asbx",
		"4_source-ns1_134.asbx",
		"4_source-ns1_135.asbx",
		"4_source-ns1_161.asbx",
		"6_source-ns1_139.asbx",
		"6_source-ns1_140.asbx",
		"6_source-ns1_141.asbx",
		"6_source-ns1_163.asbx",
		"7_source-ns1_71.asbx",
		"6_source-ns1_63.asbx",
		"6_source-ns1_64.asbx",
		"6_source-ns1_65.asbx",
		"6_source-ns1_66.asbx",
		"6_source-ns1_67.asbx",
		"6_source-ns1_68.asbx",
		"6_source-ns1_69.asbx",
		"6_source-ns1_70.asbx",
		"7_source-ns1_72.asbx",
		"7_source-ns1_73.asbx",
		"7_source-ns1_74.asbx",
		"7_source-ns1_75.asbx",
		"7_source-ns1_76.asbx",
		"7_source-ns1_77.asbx",
		"7_source-ns1_78.asbx",
		"7_source-ns1_79.asbx",
		"7_source-ns1_80.asbx",
		"7_source-ns1_142.asbx",
		"7_source-ns1_143.asbx",
		"7_source-ns1_144.asbx",
		"7_source-ns1_164.asbx",
		"8_source-ns1_81.asbx",
		"8_source-ns1_82.asbx",
		"8_source-ns1_83.asbx",
		"8_source-ns1_84.asbx",
		"8_source-ns1_85.asbx",
		"8_source-ns1_86.asbx",
		"8_source-ns1_87.asbx",
		"8_source-ns1_88.asbx",
		"8_source-ns1_89.asbx",
		"8_source-ns1_90.asbx",
		"8_source-ns1_145.asbx",
		"8_source-ns1_146.asbx",
		"8_source-ns1_147.asbx",
		"8_source-ns1_165.asbx",
		"9_source-ns1_91.asbx",
		"9_source-ns1_92.asbx",
		"9_source-ns1_93.asbx",
		"9_source-ns1_94.asbx",
		"9_source-ns1_95.asbx",
		"9_source-ns1_96.asbx",
		"9_source-ns1_97.asbx",
		"9_source-ns1_98.asbx",
		"9_source-ns1_99.asbx",
		"9_source-ns1_100.asbx",
		"9_source-ns1_148.asbx",
		"9_source-ns1_149.asbx",
		"9_source-ns1_150.asbx",
		"9_source-ns1_166.asbx",
		"10_source-ns1_101.asbx",
		"10_source-ns1_102.asbx",
		"10_source-ns1_103.asbx",
		"10_source-ns1_104.asbx",
		"10_source-ns1_105.asbx",
		"10_source-ns1_106.asbx",
		"10_source-ns1_107.asbx",
		"10_source-ns1_108.asbx",
		"10_source-ns1_109.asbx",
		"10_source-ns1_110.asbx",
		"10_source-ns1_151.asbx",
		"10_source-ns1_152.asbx",
		"10_source-ns1_153.asbx",
		"10_source-ns1_167.asbx",
		"11_source-ns1_111.asbx",
		"11_source-ns1_112.asbx",
		"11_source-ns1_113.asbx",
		"11_source-ns1_114.asbx",
		"11_source-ns1_115.asbx",
		"11_source-ns1_116.asbx",
		"11_source-ns1_117.asbx",
		"11_source-ns1_118.asbx",
		"11_source-ns1_119.asbx",
		"11_source-ns1_120.asbx",
		"11_source-ns1_154.asbx",
		"11_source-ns1_155.asbx",
		"11_source-ns1_156.asbx",
		"11_source-ns1_168.asbx",
	}

	expect := []string{
		"0_source-ns1_1.asbx",
		"1_source-ns1_10.asbx",
		"2_source-ns1_21.asbx",
		"3_source-ns1_30.asbx",
		"4_source-ns1_41.asbx",
		"5_source-ns1_51.asbx",
		"6_source-ns1_61.asbx",
		"7_source-ns1_71.asbx",
		"8_source-ns1_81.asbx",
		"9_source-ns1_91.asbx",
		"10_source-ns1_101.asbx",
		"11_source-ns1_111.asbx",
		"0_source-ns1_2.asbx",
		"1_source-ns1_12.asbx",
		"2_source-ns1_22.asbx",
		"3_source-ns1_32.asbx",
		"4_source-ns1_42.asbx",
		"5_source-ns1_52.asbx",
		"6_source-ns1_62.asbx",
		"7_source-ns1_72.asbx",
		"8_source-ns1_82.asbx",
		"9_source-ns1_92.asbx",
		"10_source-ns1_102.asbx",
		"11_source-ns1_112.asbx",
		"0_source-ns1_3.asbx",
		"1_source-ns1_13.asbx",
		"2_source-ns1_23.asbx",
		"3_source-ns1_33.asbx",
		"4_source-ns1_43.asbx",
		"5_source-ns1_53.asbx",
		"6_source-ns1_63.asbx",
		"7_source-ns1_73.asbx",
		"8_source-ns1_83.asbx",
		"9_source-ns1_93.asbx",
		"10_source-ns1_103.asbx",
		"11_source-ns1_113.asbx",
		"0_source-ns1_4.asbx",
		"1_source-ns1_14.asbx",
		"2_source-ns1_24.asbx",
		"3_source-ns1_34.asbx",
		"4_source-ns1_44.asbx",
		"5_source-ns1_54.asbx",
		"6_source-ns1_64.asbx",
		"7_source-ns1_74.asbx",
		"8_source-ns1_84.asbx",
		"9_source-ns1_94.asbx",
		"10_source-ns1_104.asbx",
		"11_source-ns1_114.asbx",
		"0_source-ns1_5.asbx",
		"1_source-ns1_15.asbx",
		"2_source-ns1_25.asbx",
		"3_source-ns1_35.asbx",
		"4_source-ns1_45.asbx",
		"5_source-ns1_55.asbx",
		"6_source-ns1_65.asbx",
		"7_source-ns1_75.asbx",
		"8_source-ns1_85.asbx",
		"9_source-ns1_95.asbx",
		"10_source-ns1_105.asbx",
		"11_source-ns1_115.asbx",
		"0_source-ns1_6.asbx",
		"1_source-ns1_16.asbx",
		"2_source-ns1_26.asbx",
		"3_source-ns1_36.asbx",
		"4_source-ns1_46.asbx",
		"5_source-ns1_56.asbx",
		"6_source-ns1_66.asbx",
		"7_source-ns1_76.asbx",
		"8_source-ns1_86.asbx",
		"9_source-ns1_96.asbx",
		"10_source-ns1_106.asbx",
		"11_source-ns1_116.asbx",
		"0_source-ns1_7.asbx",
		"1_source-ns1_17.asbx",
		"2_source-ns1_27.asbx",
		"3_source-ns1_37.asbx",
		"4_source-ns1_47.asbx",
		"5_source-ns1_57.asbx",
		"6_source-ns1_67.asbx",
		"7_source-ns1_77.asbx",
		"8_source-ns1_87.asbx",
		"9_source-ns1_97.asbx",
		"10_source-ns1_107.asbx",
		"11_source-ns1_117.asbx",
		"0_source-ns1_8.asbx",
		"1_source-ns1_18.asbx",
		"2_source-ns1_28.asbx",
		"3_source-ns1_38.asbx",
		"4_source-ns1_48.asbx",
		"5_source-ns1_58.asbx",
		"6_source-ns1_68.asbx",
		"7_source-ns1_78.asbx",
		"8_source-ns1_88.asbx",
		"9_source-ns1_98.asbx",
		"10_source-ns1_108.asbx",
		"11_source-ns1_118.asbx",
		"0_source-ns1_9.asbx",
		"1_source-ns1_19.asbx",
		"2_source-ns1_29.asbx",
		"3_source-ns1_39.asbx",
		"4_source-ns1_49.asbx",
		"5_source-ns1_59.asbx",
		"6_source-ns1_69.asbx",
		"7_source-ns1_79.asbx",
		"8_source-ns1_89.asbx",
		"9_source-ns1_99.asbx",
		"10_source-ns1_109.asbx",
		"11_source-ns1_119.asbx",
		"0_source-ns1_11.asbx",
		"1_source-ns1_20.asbx",
		"2_source-ns1_31.asbx",
		"3_source-ns1_40.asbx",
		"4_source-ns1_50.asbx",
		"5_source-ns1_60.asbx",
		"6_source-ns1_70.asbx",
		"7_source-ns1_80.asbx",
		"8_source-ns1_90.asbx",
		"9_source-ns1_100.asbx",
		"10_source-ns1_110.asbx",
		"11_source-ns1_120.asbx",
		"0_source-ns1_121.asbx",
		"1_source-ns1_124.asbx",
		"2_source-ns1_127.asbx",
		"3_source-ns1_130.asbx",
		"4_source-ns1_133.asbx",
		"5_source-ns1_136.asbx",
		"6_source-ns1_139.asbx",
		"7_source-ns1_142.asbx",
		"8_source-ns1_145.asbx",
		"9_source-ns1_148.asbx",
		"10_source-ns1_151.asbx",
		"11_source-ns1_154.asbx",
		"0_source-ns1_122.asbx",
		"1_source-ns1_125.asbx",
		"2_source-ns1_128.asbx",
		"3_source-ns1_131.asbx",
		"4_source-ns1_134.asbx",
		"5_source-ns1_137.asbx",
		"6_source-ns1_140.asbx",
		"7_source-ns1_143.asbx",
		"8_source-ns1_146.asbx",
		"9_source-ns1_149.asbx",
		"10_source-ns1_152.asbx",
		"11_source-ns1_155.asbx",
		"0_source-ns1_123.asbx",
		"1_source-ns1_126.asbx",
		"2_source-ns1_129.asbx",
		"3_source-ns1_132.asbx",
		"4_source-ns1_135.asbx",
		"5_source-ns1_138.asbx",
		"6_source-ns1_141.asbx",
		"7_source-ns1_144.asbx",
		"8_source-ns1_147.asbx",
		"9_source-ns1_150.asbx",
		"10_source-ns1_153.asbx",
		"11_source-ns1_156.asbx",
		"0_source-ns1_157.asbx",
		"1_source-ns1_158.asbx",
		"2_source-ns1_159.asbx",
		"3_source-ns1_160.asbx",
		"4_source-ns1_161.asbx",
		"5_source-ns1_162.asbx",
		"6_source-ns1_163.asbx",
		"7_source-ns1_164.asbx",
		"8_source-ns1_165.asbx",
		"9_source-ns1_166.asbx",
		"10_source-ns1_167.asbx",
		"11_source-ns1_168.asbx",
	}

	result, err := SortBackupFiles(list)
	require.NoError(t, err)

	require.Equal(t, expect, result)
}
