Support moving sources in srcjars in soong_zip
Add a -srcjar argument to soong_zip that causes it to read the package statement of each .java file and use that to place the source file at a path that matches the package. Test: jar_test.go, zip_test.go Change-Id: I36017e42445ba3b0a82a10a8d81e8ac0cca096f2
This commit is contained in:
182
jar/jar_test.go
Normal file
182
jar/jar_test.go
Normal file
@@ -0,0 +1,182 @@
|
||||
// Copyright 2017 Google Inc. All rights reserved.
|
||||
//
|
||||
// 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 jar
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestGetJavaPackage(t *testing.T) {
|
||||
type args struct {
|
||||
r io.Reader
|
||||
src string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
in string
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "simple",
|
||||
in: "package foo.bar;",
|
||||
want: "foo.bar",
|
||||
},
|
||||
{
|
||||
name: "comment",
|
||||
in: "/* test */\npackage foo.bar;",
|
||||
want: "foo.bar",
|
||||
},
|
||||
{
|
||||
name: "no package",
|
||||
in: "import foo.bar;",
|
||||
want: "",
|
||||
},
|
||||
{
|
||||
name: "missing semicolon error",
|
||||
in: "package foo.bar",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "parser error",
|
||||
in: "/*",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "parser ident error",
|
||||
in: "package 0foo.bar;",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
buf := bytes.NewBufferString(tt.in)
|
||||
got, err := JavaPackage(buf, "<test>")
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("JavaPackage() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if got != tt.want {
|
||||
t.Errorf("JavaPackage() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_javaIdentRune(t *testing.T) {
|
||||
// runes that should be valid anywhere in an identifier
|
||||
validAnywhere := []rune{
|
||||
// letters, $, _
|
||||
'a',
|
||||
'A',
|
||||
'$',
|
||||
'_',
|
||||
|
||||
// assorted unicode
|
||||
'𐐀',
|
||||
'𐐨',
|
||||
'Dž',
|
||||
'ῼ',
|
||||
'ʰ',
|
||||
'゚',
|
||||
'ƻ',
|
||||
'㡢',
|
||||
'₩',
|
||||
'_',
|
||||
'Ⅰ',
|
||||
'𐍊',
|
||||
}
|
||||
|
||||
// runes that should be invalid as the first rune in an identifier, but valid anywhere else
|
||||
validAfterFirst := []rune{
|
||||
// digits
|
||||
'0',
|
||||
|
||||
// assorted unicode
|
||||
'᥍',
|
||||
'𝟎',
|
||||
'ྂ',
|
||||
'𝆀',
|
||||
|
||||
// control characters
|
||||
'\x00',
|
||||
'\b',
|
||||
'\u000e',
|
||||
'\u001b',
|
||||
'\u007f',
|
||||
'\u009f',
|
||||
'\u00ad',
|
||||
0xE007F,
|
||||
|
||||
// zero width space
|
||||
'\u200b',
|
||||
}
|
||||
|
||||
// runes that should never be valid in an identifier
|
||||
invalid := []rune{
|
||||
';',
|
||||
0x110000,
|
||||
}
|
||||
|
||||
validFirst := validAnywhere
|
||||
invalidFirst := append(validAfterFirst, invalid...)
|
||||
validPart := append(validAnywhere, validAfterFirst...)
|
||||
invalidPart := invalid
|
||||
|
||||
check := func(t *testing.T, ch rune, i int, want bool) {
|
||||
t.Helper()
|
||||
if got := javaIdentRune(ch, i); got != want {
|
||||
t.Errorf("javaIdentRune() = %v, want %v", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
t.Run("first", func(t *testing.T) {
|
||||
t.Run("valid", func(t *testing.T) {
|
||||
for _, ch := range validFirst {
|
||||
t.Run(string(ch), func(t *testing.T) {
|
||||
check(t, ch, 0, true)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("invalid", func(t *testing.T) {
|
||||
for _, ch := range invalidFirst {
|
||||
t.Run(string(ch), func(t *testing.T) {
|
||||
check(t, ch, 0, false)
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("part", func(t *testing.T) {
|
||||
t.Run("valid", func(t *testing.T) {
|
||||
for _, ch := range validPart {
|
||||
t.Run(string(ch), func(t *testing.T) {
|
||||
check(t, ch, 1, true)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("invalid", func(t *testing.T) {
|
||||
for _, ch := range invalidPart {
|
||||
t.Run(string(ch), func(t *testing.T) {
|
||||
check(t, ch, 1, false)
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user