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  }