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  }