github.com/bitrise-io/go-xamarin@v0.0.0-20211005113058-bf60a8bae851/tools/buildtools/xbuild/xbuild_test.go (about) 1 package xbuild 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/bitrise-io/go-utils/pathutil" 10 "github.com/bitrise-io/go-xamarin/constants" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestNew(t *testing.T) { 15 t.Log("it create new xbuild model") 16 { 17 currentDir, err := pathutil.CurrentWorkingDirectoryAbsolutePath() 18 require.NoError(t, err) 19 20 xbuild, err := New("solution.sln", "") 21 require.NoError(t, err) 22 require.NotNil(t, xbuild) 23 24 require.Equal(t, constants.XbuildPath, xbuild.BuildTool) 25 require.Equal(t, filepath.Join(currentDir, "solution.sln"), xbuild.SolutionPth) 26 require.Equal(t, "", xbuild.configuration) 27 require.Equal(t, "", xbuild.platform) 28 require.Equal(t, "", xbuild.target) 29 30 require.Equal(t, false, xbuild.buildIpa) 31 require.Equal(t, false, xbuild.archiveOnBuild) 32 33 require.Equal(t, 0, len(xbuild.customOptions)) 34 } 35 36 t.Log("it create new xbuild model") 37 { 38 currentDir, err := pathutil.CurrentWorkingDirectoryAbsolutePath() 39 require.NoError(t, err) 40 41 xbuild, err := New("solution.sln", "project.csproj") 42 require.NoError(t, err) 43 require.NotNil(t, xbuild) 44 45 require.Equal(t, constants.XbuildPath, xbuild.BuildTool) 46 require.Equal(t, filepath.Join(currentDir, "solution.sln"), xbuild.SolutionPth) 47 require.Equal(t, filepath.Join(currentDir, "project.csproj"), xbuild.ProjectPth) 48 require.Equal(t, "", xbuild.configuration) 49 require.Equal(t, "", xbuild.platform) 50 require.Equal(t, "", xbuild.target) 51 52 require.Equal(t, false, xbuild.buildIpa) 53 require.Equal(t, false, xbuild.archiveOnBuild) 54 55 require.Equal(t, 0, len(xbuild.customOptions)) 56 } 57 } 58 59 func TestSetProperties(t *testing.T) { 60 t.Log("it sets target") 61 { 62 xbuild, err := New("/solution.sln", "") 63 require.NoError(t, err) 64 require.NotNil(t, xbuild) 65 require.Equal(t, "", xbuild.target) 66 67 xbuild.SetTarget("Build") 68 require.Equal(t, "Build", xbuild.target) 69 } 70 71 t.Log("it sets configuration") 72 { 73 xbuild, err := New("/solution.sln", "") 74 require.NoError(t, err) 75 require.NotNil(t, xbuild) 76 require.Equal(t, "", xbuild.configuration) 77 78 xbuild.SetConfiguration("Release") 79 require.Equal(t, "Release", xbuild.configuration) 80 } 81 82 t.Log("it sets platform") 83 { 84 xbuild, err := New("/solution.sln", "") 85 require.NoError(t, err) 86 require.NotNil(t, xbuild) 87 require.Equal(t, "", xbuild.platform) 88 89 xbuild.SetPlatform("iPhone") 90 require.Equal(t, "iPhone", xbuild.platform) 91 } 92 93 t.Log("it sets build ipa") 94 { 95 xbuild, err := New("/solution.sln", "") 96 require.NoError(t, err) 97 require.NotNil(t, xbuild) 98 require.Equal(t, false, xbuild.buildIpa) 99 100 xbuild.SetBuildIpa(true) 101 require.Equal(t, true, xbuild.buildIpa) 102 } 103 104 t.Log("it sets archive on build") 105 { 106 xbuild, err := New("/solution.sln", "") 107 require.NoError(t, err) 108 require.NotNil(t, xbuild) 109 require.Equal(t, false, xbuild.archiveOnBuild) 110 111 xbuild.SetArchiveOnBuild(true) 112 require.Equal(t, true, xbuild.archiveOnBuild) 113 } 114 115 t.Log("it appends custom options") 116 { 117 xbuild, err := New("/solution.sln", "") 118 require.NoError(t, err) 119 require.NotNil(t, xbuild) 120 require.Equal(t, 0, len(xbuild.customOptions)) 121 122 customOptions := []string{"/verbosity:minimal", "/nologo"} 123 xbuild.SetCustomOptions(customOptions...) 124 require.ElementsMatch(t, customOptions, xbuild.customOptions) 125 } 126 } 127 128 func Test_buildCommands(t *testing.T) { 129 t.Log("solution-dir test") 130 { 131 currentDir, err := pathutil.CurrentWorkingDirectoryAbsolutePath() 132 require.NoError(t, err) 133 134 xbuild, err := New("./test/solution.sln", "./test/ios/project.csproj") 135 require.NoError(t, err) 136 desired := []string{ 137 constants.XbuildPath, 138 filepath.Join(currentDir, "test/ios/project.csproj"), 139 fmt.Sprintf("/p:SolutionDir=%s", filepath.Join(currentDir, "test")+string(filepath.Separator)), 140 } 141 require.Equal(t, desired, xbuild.buildCommands()) 142 } 143 144 t.Log("solution-dir test") 145 { 146 xbuild, err := New("/Users/Develop/test/solution.sln", "/Users/Develop/test/test/ios/project.csproj") 147 require.NoError(t, err) 148 desired := []string{constants.XbuildPath, "/Users/Develop/test/test/ios/project.csproj", "/p:SolutionDir=/Users/Develop/test/"} 149 require.Equal(t, desired, xbuild.buildCommands()) 150 } 151 152 t.Log("it build command slice from model") 153 { 154 xbuild, err := New("/solution.sln", "") 155 require.NoError(t, err) 156 desired := []string{constants.XbuildPath, "/solution.sln", "/p:SolutionDir=/"} 157 require.Equal(t, desired, xbuild.buildCommands()) 158 159 xbuild.SetTarget("Build") 160 desired = []string{constants.XbuildPath, "/solution.sln", "/target:Build", "/p:SolutionDir=/"} 161 require.Equal(t, desired, xbuild.buildCommands()) 162 163 xbuild.SetConfiguration("Release") 164 desired = []string{constants.XbuildPath, "/solution.sln", "/target:Build", "/p:SolutionDir=/", "/p:Configuration=Release"} 165 require.Equal(t, desired, xbuild.buildCommands()) 166 167 xbuild.SetPlatform("iPhone") 168 desired = []string{constants.XbuildPath, "/solution.sln", "/target:Build", "/p:SolutionDir=/", "/p:Configuration=Release", "/p:Platform=iPhone"} 169 require.Equal(t, desired, xbuild.buildCommands()) 170 171 xbuild.SetArchiveOnBuild(true) 172 desired = []string{constants.XbuildPath, "/solution.sln", "/target:Build", "/p:SolutionDir=/", "/p:Configuration=Release", "/p:Platform=iPhone", "/p:ArchiveOnBuild=true"} 173 require.Equal(t, desired, xbuild.buildCommands()) 174 175 xbuild.SetBuildIpa(true) 176 desired = []string{constants.XbuildPath, "/solution.sln", "/target:Build", "/p:SolutionDir=/", "/p:Configuration=Release", "/p:Platform=iPhone", "/p:ArchiveOnBuild=true", "/p:BuildIpa=true"} 177 require.Equal(t, desired, xbuild.buildCommands()) 178 179 xbuild.SetCustomOptions("/nologo") 180 desired = []string{constants.XbuildPath, "/solution.sln", "/target:Build", "/p:SolutionDir=/", "/p:Configuration=Release", "/p:Platform=iPhone", "/p:ArchiveOnBuild=true", "/p:BuildIpa=true", "/nologo"} 181 require.Equal(t, desired, xbuild.buildCommands()) 182 } 183 } 184 185 func TestString(t *testing.T) { 186 t.Log("solution-dir test") 187 { 188 currentDir, err := pathutil.CurrentWorkingDirectoryAbsolutePath() 189 require.NoError(t, err) 190 191 xbuild, err := New("./test/solution.sln", "./test/ios/project.csproj") 192 require.NoError(t, err) 193 desired := fmt.Sprintf(`"%s" "%s" "%s"`, 194 constants.XbuildPath, 195 filepath.Join(currentDir, "test/ios/project.csproj"), 196 fmt.Sprintf("/p:SolutionDir=%s", filepath.Join(currentDir, "test")+string(os.PathSeparator)), 197 ) 198 require.Equal(t, desired, xbuild.String()) 199 } 200 201 t.Log("solution-dir test") 202 { 203 xbuild, err := New("/Users/Develop/test/solution.sln", "/Users/Develop/test/test/ios/project.csproj") 204 require.NoError(t, err) 205 desired := fmt.Sprintf(`"%s" "/Users/Develop/test/test/ios/project.csproj" "/p:SolutionDir=/Users/Develop/test/"`, constants.XbuildPath) 206 require.Equal(t, desired, xbuild.String()) 207 } 208 209 t.Log("it creates printable command") 210 { 211 xbuild, err := New("/solution.sln", "") 212 require.NoError(t, err) 213 desired := fmt.Sprintf(`"%s" "/solution.sln" "/p:SolutionDir=/"`, constants.XbuildPath) 214 require.Equal(t, desired, xbuild.String()) 215 216 xbuild.SetTarget("Build") 217 desired = fmt.Sprintf(`"%s" "/solution.sln" "/target:Build" "/p:SolutionDir=/"`, constants.XbuildPath) 218 require.Equal(t, desired, xbuild.String()) 219 220 xbuild.SetConfiguration("Release") 221 desired = fmt.Sprintf(`"%s" "/solution.sln" "/target:Build" "/p:SolutionDir=/" "/p:Configuration=Release"`, constants.XbuildPath) 222 require.Equal(t, desired, xbuild.String()) 223 224 xbuild.SetPlatform("iPhone") 225 desired = fmt.Sprintf(`"%s" "/solution.sln" "/target:Build" "/p:SolutionDir=/" "/p:Configuration=Release" "/p:Platform=iPhone"`, constants.XbuildPath) 226 require.Equal(t, desired, xbuild.String()) 227 228 xbuild.SetArchiveOnBuild(true) 229 desired = fmt.Sprintf(`"%s" "/solution.sln" "/target:Build" "/p:SolutionDir=/" "/p:Configuration=Release" "/p:Platform=iPhone" "/p:ArchiveOnBuild=true"`, constants.XbuildPath) 230 require.Equal(t, desired, xbuild.String()) 231 232 xbuild.SetBuildIpa(true) 233 desired = fmt.Sprintf(`"%s" "/solution.sln" "/target:Build" "/p:SolutionDir=/" "/p:Configuration=Release" "/p:Platform=iPhone" "/p:ArchiveOnBuild=true" "/p:BuildIpa=true"`, constants.XbuildPath) 234 require.Equal(t, desired, xbuild.String()) 235 236 xbuild.SetCustomOptions("/nologo") 237 desired = fmt.Sprintf(`"%s" "/solution.sln" "/target:Build" "/p:SolutionDir=/" "/p:Configuration=Release" "/p:Platform=iPhone" "/p:ArchiveOnBuild=true" "/p:BuildIpa=true" "/nologo"`, constants.XbuildPath) 238 require.Equal(t, desired, xbuild.String()) 239 } 240 } 241 242 func Test_ensureTrailingPathSeparator(t *testing.T) { 243 tests := []struct { 244 name string 245 path string 246 want string 247 }{ 248 { 249 name: "no trailing slash", 250 path: filepath.Join("a", "b"), 251 want: filepath.Join("a", "b") + string(filepath.Separator), 252 }, 253 { 254 name: "trailing slash", 255 path: filepath.Join("a", "b") + string(filepath.Separator), 256 want: filepath.Join("a", "b") + string(filepath.Separator), 257 }, 258 } 259 for _, tt := range tests { 260 t.Run(tt.name, func(t *testing.T) { 261 if got := ensureTrailingPathSeparator(tt.path); got != tt.want { 262 t.Errorf("ensureTrailingPathSeparator() = %v, want %v", got, tt.want) 263 } 264 }) 265 } 266 }