github.com/centretown/scan@v0.0.0-20190502131902-cd9b08460fee/data_test.go (about) 1 // Copyright 2019 Dave Marsh. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package scan 6 7 // data_test.go - generates, clean test data file structure 8 9 import ( 10 "fmt" 11 "io/ioutil" 12 "log" 13 "os" 14 "path" 15 16 "github.com/golang-collections/collections/queue" 17 ) 18 19 // TestFolder - test folders and files 20 type TestFolder struct { 21 name string 22 files []string 23 children []*TestFolder 24 } 25 26 // root = ".test" 27 28 var ( 29 movies = "movies" 30 movie = "movie %02d" 31 tvshows = "tv" 32 series = "Series %02d" 33 season = "Season %02d" 34 episode = "%s.s%02de%02d%s" 35 music = "music" 36 artist = "Artist %02d" 37 album = "Album %02d" 38 title = "%02d - Title %d%s" 39 vext = []string{".avi", ".mp4", ".mkv", ".mpeg", ".mpg", ".wmv"} 40 aext = []string{".mp3", ".flac", ".wav"} 41 ) 42 43 // GenerateTestData - test folders and files 44 func GenerateTestData(root string) (r *TestFolder, err error) { 45 var cur string 46 if !path.IsAbs(root) { 47 cur, err = os.Getwd() 48 if err != nil { 49 log.Fatal(err) 50 } 51 root = path.Join(cur, root) 52 } 53 54 r = &TestFolder{name: root} 55 mv := buildMovies(r) 56 tv := buildTv(r) 57 mu := buildMusic(r) 58 r.children = append(r.children, mv, tv, mu) 59 60 //create(r) 61 //r.display() 62 return 63 } 64 65 func buildMovies(r *TestFolder) (s *TestFolder) { 66 s = &TestFolder{name: path.Join(r.name, movies)} 67 count := len(vext) 68 for i := 0; i < count; i++ { 69 name := fmt.Sprintf(movie, i+1) 70 a := &TestFolder{name: path.Join(s.name, name)} 71 a.files = append(a.files, name+vext[i]) 72 s.children = append(s.children, a) 73 } 74 return 75 } 76 77 func buildTv(r *TestFolder) (s *TestFolder) { 78 s = &TestFolder{name: path.Join(r.name, tvshows)} 79 count := len(vext) 80 for i := 0; i < count; i++ { 81 name := fmt.Sprintf(series, i+1) 82 a := &TestFolder{name: path.Join(s.name, name)} 83 for j := 0; j < count; j++ { 84 bname := fmt.Sprintf(season, j+1) 85 b := &TestFolder{name: path.Join(a.name, bname)} 86 for k := 0; k < count; k++ { 87 fname := fmt.Sprintf(episode, name, j+1, k+1, vext[j]) 88 b.files = append(b.files, fname) 89 } 90 a.children = append(a.children, b) 91 } 92 s.children = append(s.children, a) 93 } 94 return 95 } 96 97 func buildMusic(r *TestFolder) (s *TestFolder) { 98 s = &TestFolder{name: path.Join(r.name, music)} 99 count := len(aext) 100 for i := 0; i < count; i++ { 101 name := fmt.Sprintf(artist, i+1) 102 a := TestFolder{name: path.Join(s.name, name)} 103 for j := 0; j < count; j++ { 104 bname := fmt.Sprintf(album, j+1) 105 b := TestFolder{name: path.Join(a.name, bname)} 106 for k := 0; k < count; k++ { 107 fname := fmt.Sprintf(title, k+1, k+1, aext[j]) 108 b.files = append(b.files, fname) 109 } 110 a.children = append(a.children, &b) 111 } 112 s.children = append(s.children, &a) 113 } 114 return 115 } 116 117 // Display - 118 func (tf *TestFolder) Display() { 119 fmt.Println(tf.name) 120 for _, f := range tf.files { 121 fmt.Println("\t" + f) 122 } 123 for _, c := range tf.children { 124 c.Display() 125 } 126 return 127 } 128 129 // DestroyTestData - 130 func (tf *TestFolder) DestroyTestData() (err error) { 131 err = os.RemoveAll(tf.name) 132 return 133 } 134 135 // Create - test folders and files 136 func (tf *TestFolder) Create() (err error) { 137 q := queue.New() 138 q.Enqueue(tf) 139 for q.Len() > 0 { 140 qtf := q.Dequeue().(*TestFolder) 141 142 if err = makeDir(qtf.name); err != nil { 143 return 144 } 145 146 if err = os.Chdir(qtf.name); err != nil { 147 return 148 } 149 150 for _, f := range qtf.files { 151 ioutil.WriteFile(f, []byte(f), os.ModePerm) 152 } 153 154 for _, c := range qtf.children { 155 q.Enqueue(c) 156 } 157 } 158 return 159 }